阻止Android活动对话框关闭外部触摸

Fer*_*mac 208 java android dialog touch android-activity

我有一个使用Theme.Dialog样式的活动,这是一个浮动窗口,而不是另一个活动.但是,当我在对话框窗口外部(在背景活动上)单击时,对话框将关闭.我怎么能阻止这种行为?

Sin*_*hak 419

为防止对话框在按下后退键时被解除,请使用此功能

dialog.setCancelable(false);
Run Code Online (Sandbox Code Playgroud)

并且为防止对话框在外部触摸时被解雇,请使用此功能

 dialog.setCanceledOnTouchOutside(false);
Run Code Online (Sandbox Code Playgroud)

  • 在较新版本的AlertDialog中,您只需要使用`setCancelable(false)` (17认同)
  • 我知道当我意识到它为时已晚,因为它帮助很多人所以没有删除它. (14认同)
  • 我知道这与问题无关,但这对我有所帮助.谢谢! (11认同)
  • 这是最好的答案.我怀疑发现这个问题的人中有几个人正在寻找一种方法来防止标准的`AlertDialog`在外面触摸时关闭,这就是这个答案所提供的. (5认同)
  • 这个答案很有帮助,但这个问题是关于使用Theme.Dialog属性的活动. (4认同)

art*_*tex 116

你实际拥有的是一个Activity(即使它看起来像一个Dialog),因此setFinishOnTouchOutside(false)如果你想在单击后台活动时保持它打开,你应该从你的活动中调用.

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

  • 这并不妨碍您在活动中按"后退"按钮.所以你还需要覆盖`onBackPressed()`在它的身体中什么都不做 (4认同)

Pet*_*etr 57

对我有用的是创建DialogFragment一个不可取消的集合:

dialog.setCancelable(false);
Run Code Online (Sandbox Code Playgroud)

  • 没有帮助。这个问题是关于活动,而不是对话框。 (2认同)

Mic*_*ert 33

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

如何在窗外触摸时取消以Activity为主题的对话框?

通过捕捉事件并无所事事,我认为你可以阻止关闭.但奇怪的是,当您触摸外部时,活动对话框的默认行为应该不会自行关闭.

(PS:代码使用WindowManager.LayoutParams)

  • 这就是他所解释的"通过抓住事件而什么都不做,我想你可以阻止关闭". (4认同)
  • 出于某种原因,在完成整个FLAG_NOT_MODAL,WATCH_OUTSIDE_TOUCH后,外部触摸确实不会关闭活动,但会点击活动后面的按钮.有什么想法吗? (4认同)

ilw*_*ilw 17

对于更高的API 10,Dialog在触摸外部时消失,而在低于API 11时,Dialog不会消失.为防止这种情况,您需要:

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

要么

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

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


Ron*_*ley 17

将对话框用作onCreate中的活动时添加此项

setFinishOnTouchOutside(false);
Run Code Online (Sandbox Code Playgroud)


Bil*_*low 12

将对话框可取消设置为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();
Run Code Online (Sandbox Code Playgroud)


小智 12

使用此代码它对我有用

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
 alertDialog.setCancelable(false);
Run Code Online (Sandbox Code Playgroud)

  • 如果OP询问*对话框*,这将是正确的答案!但问题是关于活动 - 完全不同的情况. (2认同)

Muh*_*sil 12

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

防止近距离接触外界

dialog.setCanceledOnTouchOutside(false);
Run Code Online (Sandbox Code Playgroud)


ana*_*ish 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.
Run Code Online (Sandbox Code Playgroud)

有关对话框的详细信息,请观看此链接.

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
Run Code Online (Sandbox Code Playgroud)


小智 8

只是,

alertDialog.setCancelable(false);
Run Code Online (Sandbox Code Playgroud)

防止用户在对话框外单击.


Vis*_*dey 5

使用setFinishOnTouchOutside(false)的API> 11,不要担心,因为它的Android的默认行为活动为主题的对话将不会对外界触摸完成了API <11个:)!Cheerss!


3c7*_*c71 5

我在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);
Run Code Online (Sandbox Code Playgroud)


小智 5

        alert.setCancelable(false);
        alert.setCanceledOnTouchOutside(false);
Run Code Online (Sandbox Code Playgroud)

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

  • 还请尝试解释为什么这会起作用......只是代码转储不是一个好的答案。 (2认同)