【问题标题】:Prevent Android activity dialog from closing on outside touch防止 Android 活动对话框在外部触摸时关闭
【发布时间】:2012-08-19 15:02:51
【问题描述】:

我有一个使用 Theme.Dialog 样式的活动,因此它是另一个活动上方的浮动窗口。但是,当我在对话框窗口外(在后台活动上)单击时,对话框将关闭。我怎样才能阻止这种行为?

【问题讨论】:

  • 你为什么要那样做。如果您想要的行为是对话框,为什么不使用对话框?谈到你的问题,我认为没有解决办法。
  • @KumarBibek 对话框在布局自定义方面受到限制......这就是活动的原因。甚至开发人员文档也推荐这种方法进行灵活的定制
  • 而 OP 想要的是一个 Modal 对话框,即强制用户响应的对话框,例如 OK 或 Yes/No。用户不应该只是点击离开。

标签: java android android-activity dialog touch


【解决方案1】:

要防止对话框在按下后退键时消失,请使用此

dialog.setCancelable(false);

为了防止对话框在外部触摸时被关闭,请使用此

 dialog.setCanceledOnTouchOutside(false);

【讨论】:

  • 这个答案很有帮助,但这个问题是关于使用 Theme.Dialog 属性的活动。
  • 我知道当我意识到它为时已晚,因为它帮助了很多人,所以没有删除它。
  • 我知道这与问题无关,但这对我有帮助。谢谢!
  • 这是最好的答案。我怀疑 大多数 发现这个问题的人正在寻找一种方法来防止标准 AlertDialog 关闭外部接触,这就是这个答案所提供的。
  • 在较新版本的 AlertDialog 上,您只需要使用setCancelable(false)
【解决方案2】:

您实际上拥有的是一个 Activity(即使它看起来像一个 Dialog),因此如果您希望在单击背景 Activity 时保持打开状态,您应该从您的 Activity 中调用 setFinishOnTouchOutside(false)

编辑:这仅适用于 android API 级别 11 或更高版本

【讨论】:

  • 这不会阻止您在活动中按“返回”按钮。所以你还需要覆盖onBackPressed() 在它的主体中什么都不做
  • 如果没有 onBackPressed(),它不会阻止该对话框 Activity 中的“后退”按钮。与 this.setFinishOnTouchOutside(false) 完美搭配。
【解决方案3】:

对我有用的是创建 DialogFragment 并将其设置为不可取消:

dialog.setCancelable(false);

【讨论】:

  • 没有帮助。这个问题是关于活动,而不是对话框。
  • 所有对话框都属于 Dialog 类,在 AlertDialog 的情况下只需将此标志设置为 false 并且应该适用于外部触摸和返回按钮。
【解决方案4】:

这可以帮助你。这是一种处理触摸外部事件的方法:

How to cancel an Dialog themed like Activity when touched outside the window?

通过捕捉事件并且什么都不做,我认为你可以防止关闭。但奇怪的是,您的活动对话框的默认行为应该是在您触摸外部时自行关闭。

(PS:代码使用WindowManager.LayoutParams)

【讨论】:

  • 虽然对象不是对话框,但它是一个使用对话框样式的 Activity。 Activity 没有这个方法,不能强制转换为 Dialog。
  • 您的帖子与所要求的完全相反。他问的是如何防止关闭而不是如何导致关闭。
  • 这就是他解释的“通过抓住事件而什么都不做,我认为你可以防止关闭”。
  • 由于某种原因,在做了整个FLAG_NOT_MODAL,WATCH_OUTSIDE_TOUCH之后,外部触摸实际上并没有关闭活动,而是点击了活动背后的按钮。有什么想法吗?
  • 请注意,对话框有阴影(至少到现在 (8.0)):如果您单击阴影,Android 将像在对话框中一样解释该单击。只是想与全世​​界分享,我花了 10 分钟才搞定。
【解决方案5】:

当在 onCreate 中使用对话框作为活动时,添加这个

setFinishOnTouchOutside(false);

【讨论】:

    【解决方案6】:

    对于更高的 API 10,对话框在外部触摸时会消失,而在低于 API 11 的情况下,对话框不会消失。为了防止这种情况,您需要这样做:

    styles.xml:<item name="android:windowCloseOnTouchOutside">false</item>

    onCreate() 方法中,使用:this.setFinishOnTouchOutside(false);

    注意:对于 API 10 及更低版本,此方法无效,不需要。

    【讨论】:

      【解决方案7】:

      将可取消的对话框设置为 false 就足够了,您在警报对话框之外触摸或单击后退按钮都会使警报对话框消失。所以用这个:

      setCancelable(false)

      并且不再需要其他功能: dialog.setCanceledOnTouchOutside(false);

      如果您正在创建一个临时对话框并想在其中放置这行代码,这里有一个示例:

      new AlertDialog.Builder(this)
                              .setTitle("Trial Version")
                              .setCancelable(false)
                              .setMessage("You are using trial version!")
                              .setIcon(R.drawable.time_left)
                              .setPositiveButton(android.R.string.yes, null).show();
      

      【讨论】:

        【解决方案8】:
        Dialog dialog = new Dialog(context)
        dialog.setCanceledOnTouchOutside(true); 
        //use this to dismiss the dialog on outside click of dialog
        
        dialog.setCanceledOnTouchOutside(false);
        //use this for not to dismiss the dialog on outside click of dialog.
        

        观看此链接以了解有关dialog. 的更多详细信息

        dialog.setCancelable(false);
        //used to prevent the dismiss of dialog on backpress of that activity
        
        dialog.setCancelable(true);
        //used to dismiss the dialog on onbackpressed of that activity
        

        【讨论】:

        • 请注意,该问题与用作对话框的活动有关,而不是与 Dialog 类有关。
        【解决方案9】:

        使用对我有用的代码

         AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
         alertDialog.setCancelable(false);
        

        【讨论】:

        • 这应该是正确的答案,如果他能做正确的问题!
        • 如果 OP 询问的是 dialogs,这将是正确的答案!但问题是关于活动的——情况完全不同。
        • 所以.setCanceledOnTouchOutside(false)只能在.create()之后访问
        【解决方案10】:

        不推荐使用警报对话框,因此请使用 Dialog dialog = new Dialog(this);

        为了防止在外部触摸时关闭

        dialog.setCanceledOnTouchOutside(false);
        

        【讨论】:

          【解决方案11】:

          简单地说,

          alertDialog.setCancelable(false);
          

          防止用户在对话框外点击。

          【讨论】:

            【解决方案12】:

            我在 onCreate() 中使用它,似乎适用于任何版本的 Android;在 5.0 和 4.4.x 上测试,无法在 Gingerbread 上测试,三星设备(运行 GB 的注 1)默认采用这种方式:

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
                {
                    setFinishOnTouchOutside(false);
                }
                else
                {
                    getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
                }
            
                super.onCreate(savedInstanceState);
            

            【讨论】:

            • 活动用作对话框的完美答案,而不是警报对话框类。
            • OP 的问题是关于活动,而不是警报对话框。
            【解决方案13】:

            setFinishOnTouchOutside(false) 用于 API > 11,不要担心,因为它的 android 的默认行为是活动主题对话框不会在外部触摸 API

            【讨论】:

              【解决方案14】:
                      alert.setCancelable(false);
                      alert.setCanceledOnTouchOutside(false);
              

              我想这会对你有所帮助。它对我有用

              【讨论】:

              • 还请尝试解释为什么这会起作用...只是代码转储不是一个好的答案。
              【解决方案15】:

              这是我的解决方案:

              AlertDialog.Builder builder = new AlertDialog.Builder(this);
              builder.setTitle("Select The Difficulty Level");
              builder.setCancelable(false);
              

              【讨论】:

                【解决方案16】:

                也可以分配实现 onCancelListener 的不同操作:

                alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){                   
                    @Override
                    public void onCancel(DialogInterface dialogInterface) {
                        //Your custom logic
                    } 
                });
                

                【讨论】:

                • 如何识别是否因为在警报对话框外点击而调用了取消?
                • 非常有助于在警报对话框外创建自定义操作!
                【解决方案17】:

                我也遇到了同样的问题。为了处理它,我在对话框中设置了一个OntouchListener,并且在里面什么也不做。但是旋转屏幕时对话框也会消失。为了修复它,我设置了一个变量来告诉我对话框是否正常关闭。然后我在对话框中设置了OnDismissListener,并在里面检查了变量。如果对话框正常关闭,我什么也不做,否则我再次运行对话框(并将他的状态设置为在我的情况下关闭时)。

                【讨论】:

                  【解决方案18】:

                  builder.setCancelable(false);


                  public void Mensaje(查看 v){

                      AlertDialog.Builder builder = new AlertDialog.Builder(this);
                      builder.setTitle("¿Quieres ir a el Menú principal?");
                      builder.setMessage("Al presionar SI iras a el menú y saldras de la materia.");
                      builder.setPositiveButton("SI", null);
                      builder.setNegativeButton("NO", null);
                      builder.setCancelable(false);
                      builder.show();
                  }
                  

                  【讨论】:

                  • 嗨,亚历克斯。欢迎来到 StackOverflow,感谢您的回答。您能否编辑您的答案以描述您的代码的作用以及它如何解决 OP 的问题?不鼓励仅使用代码回答,因为它们不教授或解释为什么。谢谢!
                  【解决方案19】:

                  这是您所有问题的完美答案....希望您喜欢在 Android 中编码

                  new AlertDialog.Builder(this)
                              .setTitle("Akshat Rastogi Is Great")
                              .setCancelable(false)
                              .setMessage("I am the best Android Programmer")
                              .setPositiveButton("I agree", new DialogInterface.OnClickListener() {
                                  @Override
                                  public void onClick(DialogInterface dialog, int which) {
                                      dialog.dismiss();
                  
                                  }
                              })
                              .create().show();
                  

                  【讨论】:

                  • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。一个适当的解释将通过展示为什么这是解决问题的好方法来极大地提高其长期价值,并使其对有其他类似问题的未来读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。
                  猜你喜欢
                  • 2023-03-31
                  • 2014-06-25
                  • 2020-04-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-02-12
                  • 2017-06-28
                  相关资源
                  最近更新 更多