具有自定义视图的对话框,setCanceledOnTouchOutside不起作用

时间:2011-05-30 07:21:57

标签: android android-layout android-widget

使用带有自定义视图的Dialog。该视图的布局为300dp x 300dp,大小并以屏幕为中心。现在我希望当用户触摸对话框外时它被解雇。我想:好极了!有一个函数:setCanceledOnTouchOutside(boolean)。但我没有效果。它根本不起作用。 我还尝试添加一个onTouchListener并侦听对话框外的事件,但这些事件似乎没有被侦听器捕获:(

为什么这不起作用或如何以另一种方式完成任何想法?

以下是我如何宣布对话:

mMenuDialog = new Dialog(this,
            android.R.style.Theme_Translucent_NoTitleBar);
    mMenuDialog.setContentView(R.layout.menu_dialog);
    mMenuDialog.setCancelable(true);
    mMenuDialog.setCanceledOnTouchOutside(true);

这是自定义视图的声明

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp" android:layout_height="300dp"
android:background="@drawable/menu_dialog_background"
android:orientation="vertical" android:layout_gravity="center"
android:id="@+id/dialog_root">
...
</LinearLayout>

以下是使用的背景:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<padding android:left="15dp" android:top="15dp" android:right="15dp"
    android:bottom="15dp" />
<solid android:color="#f0f0f0" />
<corners android:radius="15dip" />
</shape> 

2 个答案:

答案 0 :(得分:14)

可能有点迟了但对于那些仍在寻找答案的人来说,就是这样。

将自定义样式应用于对话框。按照您的风格,包括:

<item name="android:windowIsFloating">true</item>

否则对话框将全屏显示。因此没有外部区域可以点击取消。这适用于具有自定义内容的对话框。

示例:

<style name="dialog_theme" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_gravity">center</item>
</style>

希望这有帮助。

答案 1 :(得分:2)

我现在通过使用额外的LinearLayout包装我的自定义对话框视图布局并向此包装LinearLayout添加onTouchListener来解决它。在onTouchListener中,我检查了点击是在对话框的内部还是外部。