2012-08-24 69 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); 

防止點擊對話框外的用戶。

相關問題