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

时间:2012-08-24 03:29:40

标签: java android android-activity dialog touch

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

18 个答案:

答案 0 :(得分:363)

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

dialog.setCancelable(false);

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

 dialog.setCanceledOnTouchOutside(false);

答案 1 :(得分:113)

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

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

答案 2 :(得分:52)

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

dialog.setCancelable(false);

答案 3 :(得分:32)

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

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

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

(PS:代码使用WindowManager.LayoutParams)

答案 4 :(得分:17)

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

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

OR

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

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

答案 5 :(得分:14)

在onCreate中使用对话框作为活动时添加此

setFinishOnTouchOutside(false);

答案 6 :(得分:12)

使用此代码为我工作

<select multiple>
    <?php
        foreach($courses as $course){
            $option = "<option value=\"{$course->Id}\"";
            if(in_array($course->Id, $selected_course)){
                $option .= " selected";
            }
            $option .= ">{$course->name}</option>";
            echo $option;
        }
    ?>
</select>

答案 7 :(得分:10)

将对话框可取消设置为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 :(得分: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

答案 9 :(得分:8)

简单地说,

alertDialog.setCancelable(false);

阻止用户在对话框外单击。

答案 10 :(得分:5)

setFinishOnTouchOutside(false)用于API&gt; 11并且不要担心因为它的android的默认行为,活动主题对话框将无法在外部触摸上完成API&lt; 11 :) !!干杯!

答案 11 :(得分: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);

答案 12 :(得分:3)

不建议使用“警告对话框”,因此请使用“对话框对话框” =“新对话框(this);

为防止外界触摸而闭合

dialog.setCanceledOnTouchOutside(false);

答案 13 :(得分:3)

这是我的解决方案:

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

答案 14 :(得分:2)

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

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

答案 15 :(得分:1)

builder.setCancelable(假);

public void Mensaje(View 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();
}

答案 16 :(得分:1)

我遇到了同样的问题。为了处理它,我在对话框中设置了一个OntouchListener并且什么也没做。但是在旋转屏幕时Dialog也会被忽略。为了解决这个问题,我设置了一个变量来告诉我对话框是否正常被解雇。然后我在我的对话框中设置OnDismissListener,在里面检查变量。如果对话框通常不正常,我不会,或者我再次运行对话框(并设置他的状态,就像在我的情况下解雇一样)。

答案 17 :(得分:-1)

这是您所有问题的完美答案....希望您喜欢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();