通过外部触摸事件关闭对话框不起作用

时间:2015-06-09 07:28:21

标签: android dialog window android-alertdialog

我有一个utils类,它会在我的应用程序中返回一个对话框。因为我需要提供用户在外部点击时关闭对话框。所以在这里我像这样使用

lDialog.setCancelable( true );
lDialog.setCanceledOnTouchOutside( true );

我审核了其中一些链接Here& here

即使我也检查了这些标志

lDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
            lDialog.getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);

但它对我不起作用..我从SOF中提到了太多的答案,但遗憾的是没有任何对我有用..

这是我到目前为止尝试的全套代码。除了外部触摸解除事件外它工作得很完美。

 public static Dialog createDialog( Context context,
            int viewId )
    {
        Dialog lDialog = new Dialog( context,
                                     AlertDialog.THEME_HOLO_LIGHT );
        lDialog.getWindow().setBackgroundDrawable( new ColorDrawable( 1 ) );
        lDialog.requestWindowFeature( Window.FEATURE_NO_TITLE );

        lDialog.setContentView( viewId );
        lDialog.setCancelable( true );
        lDialog.setCanceledOnTouchOutside( true );
        lDialog.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );


        return lDialog;
    }

抱歉我的英语不好!!谢谢。

2 个答案:

答案 0 :(得分:1)

在这里,最后我要回答我的问题。

如果您希望对话框全屏,则使用AlertDialog.THEME_HOLO_LIGHT将无效。另一种方法是创建自己的样式,如下所示:

 public static Dialog createDialog( Context context,
            int viewId )
    {
        Dialog lDialog = new Dialog( context,
                                     R.style.ThemeDialogCustom );
        lDialog.getWindow().setBackgroundDrawable( new ColorDrawable( 1 ) );
        lDialog.requestWindowFeature( Window.FEATURE_NO_TITLE );

        lDialog.setContentView( viewId );
        lDialog.setCancelable( true );
        lDialog.setCanceledOnTouchOutside( true );
        lDialog.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );

        return lDialog;
    }

在values文件夹中有style.xml,如下面的:::

<?xml version="1.0" encoding="utf-8"?>

<resources>
<style name="ThemeDialogCustom" parent="android:Theme.Dialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowBackground">@color/transparent_color</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
   </style>

</resources>

还在values folder :::

中添加colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="transparent_color">#00000000</color>
</resources>

这对我有用。希望它也适合你:)

答案 1 :(得分:0)

对话框可能会占用整个屏幕,因此没有“外部”点击。您是否尝试过制作一个非常简单的对话框,然后在外部点击进行测试。

我从未使用过这些setFlags方法:

    lDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
    lDialog.getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);

或者这个:

 WindowManager.LayoutParams lp2 = new WindowManager.LayoutParams();
 lp2.copyFrom( lDialog.getWindow().getAttributes() );
 lp2.width = WindowManager.LayoutParams.MATCH_PARENT;
 lp2.height = WindowManager.LayoutParams.MATCH_PARENT;
 lDialog.getWindow().setAttributes( lp2 );

我使用setCanceledOnTouchOutside

没问题