2011-12-05 44 views
2

我實現這個自定義AlertDialog像這樣:如何製作android對話框模式?

AlertDialog dialog = new AlertDialog.Builder(this) 
    .setView(dialogView) 
    .setTitle(getResources().getString(R.string.addedit_asklater_price)) 
    .setCancelable(false) 
    .create(); 

    dialog.setMessage(text); 
    dialog.setOwnerActivity(this); 
    dialog.setButton(...) 
    dialog.setButton(...) 
    dialog.show(); 

    doProcessUserInput(); 

然而,我發現後dialog.show()控制立即流向doProcessUserInput()無需等待用戶駁回使用任何對話框按鈕的對話框。

這種行爲似乎很奇怪,我期待對話框是模態的,就像我總是知道模態對話框一樣。

我可以重構我的代碼,以便從對話框按鈕onClickListener調用doProcessUserInput()。但是我想知道是否有一種方法可以在dialog.show()處暫停程序執行,直到對話完成。

PS:

  1. 我一直在使用,擴展對話框定製對話框試過,但它具有 同樣的問題。我在按鈕的 onClickListener中創建對話框。
  2. 我試過實施Activity::onCreateDialog並使用showDialog(id)而不是dialog.show(),但這有同樣的問題。

回答

4

當然,您可以爲您的對話框設置onPositiveButton click監聽器,並從該監聽器執行您的操作。

如果您確實想在某個時間點暫停您的活動,您可能會使用舊的java wait/notify機制或更方便的新機制(如執行程序)。

爲什麼你想這樣做,但不明確。 Android對話框專門設計爲非模態的,因此它們不會阻止您的應用程序(因爲您的應用程序可以包含其他活動,如本地電話呼叫活動,如果這些活動被阻止,將會很糟糕)。

+0

嗯...現在有道理。沒有想過這個角度。來自一生桌面編程的蜘蛛網。 –

2

此外,您不應該阻止對話框中的應用程序流。

Android開發指南和社區最佳做法指出,如果你想要某種模式,你必須做它在onClickListener s。

4

這適用於我:創建一個活動作爲您的對話框。然後,

  1. 添加到您的艙單活動:

    機器人:主題=「@安卓風格/主題。對話」

  2. 一下添加到您的onCreate活動

    setFinishOnTouchOutside(假);

  3. 覆蓋在你的活動onBackPressed:

    @覆蓋 公共無效onBackPressed(){ //防止「回」離開此活動 }

第一個給對話框外觀的活動。後兩者使其表現得像一個模態對話框。

+0

我到處尋找這一個簡單的線setFinishOnTouchOutside(false); 謝謝!並且重寫onBackPressed()也是完美的! – LargeGlasses

1

在調用對話框show()方法之前,請嘗試調用.setCancelable(false)。這對我來說非常合適。