2012-08-24 62 views
142

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

+1

为什么你会那样做顺便说一句。如果你想要的行为是对话框,为什么不使用对话框?回答你的问题,我认为没有解决方案。 –

+0

@KumarBibek对话框在布局定制时受到限制......这就是为什么一个活动。即使开发人员文档也建议使用这种方法进行灵活的定制 – Leo

+0

而OP需要的是一个** Modal **对话框,即强制用户响应的对话框,例如OK或Yes/No。用户不应该只能点击一下。 –

回答

25

这可以帮助你。这是处理触摸事件之外的方式:

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

通过捕获的事件,无所事事,我想你可以防止关闭。但是奇怪的是,当你触摸外部时,你的活动对话框的默认行为应该是而不是

(PS:该代码使用WindowManager.LayoutParams)

+1

该对象虽然不是对话框,但它是使用对话框样式的Activity。活动不具有此方法,并且不能转换为Dialog。 – Fergusmac

+0

好吧,对不起,我误解了,我很快就会更正我的答案 –

+0

我编辑添加我发现可以帮助你 –

99

什么你实际上有是一种活动(即使它看起来像一个对话框),因此,你应该从你的活动叫setFinishOnTouchOutside(false)如果你想保持它打开当点击后台活动时。

编辑:这只是与Android API级别工作11或更高

+3

这并不妨碍您在活动中按下“返回”按钮。所以你也需要重写'onBackPressed()'在其正文中无所作为 –

+0

没有在没有onBackPressed()的Activity对话框中阻止“返回”按钮。用this.setFinishOnTouchOutside(false)完美工作。 – Kunalxigxag

+0

效果不错,谢谢 –

22

什么工作对我来说是创造dialogFragment一组它不会取消:

dialog.setCancelable(假);

+1

没有帮助。这个问题是关于活动,而不是对话框。 –

275

为了防止对话框从返回键按下的使用越来越驳回了这一

dialog.setCancelable(false); 

此外,要防止对话框从外面取得联系驳回使用

dialog.setCanceledOnTouchOutside(false); 
+4

这个答案很有帮助,但是这个问题是关于使用Theme.Dialog属性的活动。 –

+7

我知道什么时候我意识到它太晚了,因为它帮助很多人没有删除它。 – Singhak

+6

我知道这并不是真的属于这个问题,但是这对我有帮助。谢谢! – dennisdrew

1

我面临着同样的问题。为了处理它,我在对话框中设置了一个OntouchListener,并且什么都不做。但是Dialog在旋转屏幕时也会放弃。为了解决这个问题,我设置了一个变量来告诉我对话框是否正常解除了。然后我设置了一个OnDismissListener到我的对话框,并在里面检查变量。如果对话框正常排除,我什么都没有,否则我再次运行对话框(并将其状态设置为在我的情况下解散)。

14

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

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

OR

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

注:API 10以及下,这种方法没有按”没有效果,也不需要。

+0

正是我在找的东西。谢谢! – masterwok

4

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

5

我在onCreate()中使用它,似乎可以在任何Android版本上使用;在5.0和4.4上测试。X,不能在姜饼测试,三星设备(注1运行GB)有它这种方式默认为:

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

    super.onCreate(savedInstanceState); 
6
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 teh dialog on onbackpressed of that activity 
+0

请注意,这个问题涉及用作对话框的活动,而不是Dialog类。 –

+1

不错...非常好...很好看回答:P –

3
 alert.setCancelable(false); 
     alert.setCanceledOnTouchOutside(false); 
此链接查看更多细节

我想这会帮助你。它对我来说

+1

也请尝试解释为什么这将工作...只是代码转储不是一个好的答案。 – Codebender

0

也可以指定不同的动作im plementing onCancelListener:

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

如何通过点击警报对话框来确定是否调用取消? – cegprakash

10

设置对话框中取消是假的就足够了,任你摸警告对话框外,或单击后退按钮将使警告对话框消失。所以,用这一个:

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(); 
11

使用此代码,它的工作对我来说

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

+0

是的,这对我来说工作得很好。 – Kogile

+0

这应该是正确的答案,如果他能做出正确的问题! – alijunior

+1

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

3

这里是我的解决方案:

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

builder.setCancelable(假);


公共无效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(); 
} 
+1

嗨,亚历克斯。欢迎来到StackOverflow并感谢您的回答。您能否编辑您的答案来描述您的代码的功能以及如何解决OP的问题?只编码的答案是不鼓励的,因为他们没有教导或解释_why_。谢谢! –

6

当使用对话框,在OnCreate活动添加此

setFinishOnTouchOutside(false); 
6

简单,

alertDialog.setCancelable(false); 

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

相关问题