2012-08-27 61 views
47

我試圖防止在Android中按下後退按鈕時關閉AlertDialog框。我遵循了兩種流行的方法in this thread和System.out.println我可以看到,在這兩種情況下代碼都會執行。但是,後退按鈕仍然關閉對話框。防止後退按鈕關閉對話框

我會做什麼錯?最終,我試圖阻止後退按鈕關閉一個對話框 - 這是一個免責聲明,該應用程序第一次運行時顯示,我不希望用戶有任何選項,但要按「接受」按鈕爲了繼續應用程序的訂單。

+1

如果您需要用戶接受許可證或免責聲明(或其他),那麼您必須**允許他們拒絕。如果他們點擊「返回」按鈕,那麼請確保您的許可證/免責聲明對話框在他們下次啓動應用程序時再次出現,並一次又一次,直到他們接受或從設備中刪除應用程序。如果您選擇使用Sam建議的方法,那麼您必須**提供「拒絕」按鈕,但在下次啓動應用程序時重新創建許可證/免責聲明。 – Squonk

+1

我會刪除一個讓我「接受」爲唯一選項的應用程序......並且甚至不考慮禁用主頁按鈕! – WarrenFaith

+0

該應用程序可以通過按主頁按鈕關閉,但實質上,如果許可證未被接受,應用程序無法通過免責聲明。 @Squonk,你提到我*必須*允許他們拒絕;這是一個法律問題嗎?即是否有一項法律規定軟件必須可用(如果已經支付)而不接受許可協議?注:我已經有一個「拒絕」按鈕,並按下此按鈕會彈出一個Toast(),表示您必須接受該協議才能使用該應用程序。該對話框因此一直持續到接受按下。 – CaptainProg

回答

110

只需使用setCancelable()功能:

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

這樣可以防止關閉對話框返回按鈕,但留下的「負」按鈕不變,如果您選擇使用它。


雖然不希望接受您的服務條款可以從用戶協議的「回退」按home鍵,在溼眶客的評論來看,這裏有兩個更多的方式,以防止他們的任何用戶。一個是簡單的「拒絕」按鈕和其他覆蓋對話框中的後退按鈕:

builder.setNegativeButton("Refuse", new OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       finish(); 
      } 
     }) 
     .setOnKeyListener(new OnKeyListener() { 
      @Override 
      public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
       if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) 
        finish(); 
       return false; 
      } 
     }); 
+0

其工作,謝謝 –

+18

此外,如果使用'DialogFragment',你應該調用'setCancelable'而不是'Dialog'本身 – Kuffs

+0

非常感謝@Kuffs。我將它設置在對話框中,並想知道爲什麼它不起作用! – sasikt

10

爲了防止後退按鈕關閉對話框(不依賴於活動),只是下面的代碼:

alertDialog.setOnKeyListener(new DialogInterface.OnKeyListener() { 
    @Override 
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
     // Prevent dialog close on back press button 
     return keyCode == KeyEvent.KEYCODE_BACK; 
    } 
}); 
+1

在我的情況下工作得很漂亮。我不得不在我的app上加載一個'WebView'。我必須檢查'canGoBack()'並關閉對話框,如果它是錯誤的。 – pandalion98

1

使用setCancelable(false)

SampleDialog sampleDialog = SampleDialog.newInstance(); 
sampleDialog.setCancelable(false); 
sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName()); 
0

只有這個工作對我來說:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
builder.setTitle(title); 
builder.setMessage(content); 

/** 
* Make it when the Back button is pressed, the dialog isn't dismissed. 
*/ 
builder.setOnKeyListener(new DialogInterface.OnKeyListener() { 
    @Override 
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
     if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { 
      Utilities.makeToast(getContext(), "There is no way back!"); 
      return true; // Consumed 
     } 
     else { 
      return false; // Not consumed 
     } 
    } 
}); 

Dialog dialog = builder.create(); 

/** 
* Make it so touching on the background activity doesn't close the dialog 
*/ 
dialog.setCanceledOnTouchOutside(false); 

return dialog; 

正如您所看到的,我還添加了一條dialog.setCanceledOnTouchOutside(false);行,因此在對話框外部輕敲不會導致它被關閉。

0

當使用DialogFragment您需要調用setCancelable()的片段,而不是對話框:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    dialog = new ProgressDialog(getActivity()); 
    dialog.setIndeterminate(true); 
    dialog.setMessage(...); 
    setCancelable(false); 

    return dialog; 
} 

調用dialog.setCancelable()似乎沒有任何效果。看起來DialogFragment沒有注意到對話框的可取消設置。

相關問題