【问题标题】:Dismissing the dialog by outside touch event is not working通过外部触摸事件关闭对话框不起作用
【发布时间】:2015-08-23 21:19:44
【问题描述】:

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

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;
    }

对不起我的英语不好!谢谢。

【问题讨论】:

    标签: android dialog window android-alertdialog


    【解决方案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 文件夹中添加 colors.xml:::

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="transparent_color">#00000000</color>
    </resources>
    

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

    【讨论】:

      【解决方案2】:

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

      我从未使用过这些 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没有问题

      【讨论】:

      • 我会检查这个@reidzeibel
      猜你喜欢
      • 2014-06-25
      • 2023-03-31
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2012-01-13
      相关资源
      最近更新 更多