我試圖防止在Android中按下後退按鈕時關閉AlertDialog框。我遵循了兩種流行的方法in this thread和System.out.println我可以看到,在這兩種情況下代碼都會執行。但是,後退按鈕仍然關閉對話框。防止後退按鈕關閉對話框
我會做什麼錯?最終,我試圖阻止後退按鈕關閉一個對話框 - 這是一個免責聲明,該應用程序第一次運行時顯示,我不希望用戶有任何選項,但要按「接受」按鈕爲了繼續應用程序的訂單。
我試圖防止在Android中按下後退按鈕時關閉AlertDialog框。我遵循了兩種流行的方法in this thread和System.out.println我可以看到,在這兩種情況下代碼都會執行。但是,後退按鈕仍然關閉對話框。防止後退按鈕關閉對話框
我會做什麼錯?最終,我試圖阻止後退按鈕關閉一個對話框 - 這是一個免責聲明,該應用程序第一次運行時顯示,我不希望用戶有任何選項,但要按「接受」按鈕爲了繼續應用程序的訂單。
只需使用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;
}
});
爲了防止後退按鈕關閉對話框(不依賴於活動),只是下面的代碼:
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;
}
});
在我的情況下工作得很漂亮。我不得不在我的app上加載一個'WebView'。我必須檢查'canGoBack()'並關閉對話框,如果它是錯誤的。 – pandalion98
使用setCancelable(false)
SampleDialog sampleDialog = SampleDialog.newInstance();
sampleDialog.setCancelable(false);
sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName());
只有這個工作對我來說:
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);
行,因此在對話框外部輕敲不會導致它被關閉。
當使用DialogFragment
您需要調用setCancelable()
的片段,而不是對話框:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
dialog = new ProgressDialog(getActivity());
dialog.setIndeterminate(true);
dialog.setMessage(...);
setCancelable(false);
return dialog;
}
調用dialog.setCancelable()
似乎沒有任何效果。看起來DialogFragment
沒有注意到對話框的可取消設置。
如果您需要用戶接受許可證或免責聲明(或其他),那麼您必須**允許他們拒絕。如果他們點擊「返回」按鈕,那麼請確保您的許可證/免責聲明對話框在他們下次啓動應用程序時再次出現,並一次又一次,直到他們接受或從設備中刪除應用程序。如果您選擇使用Sam建議的方法,那麼您必須**提供「拒絕」按鈕,但在下次啓動應用程序時重新創建許可證/免責聲明。 – Squonk
我會刪除一個讓我「接受」爲唯一選項的應用程序......並且甚至不考慮禁用主頁按鈕! – WarrenFaith
該應用程序可以通過按主頁按鈕關閉,但實質上,如果許可證未被接受,應用程序無法通過免責聲明。 @Squonk,你提到我*必須*允許他們拒絕;這是一個法律問題嗎?即是否有一項法律規定軟件必須可用(如果已經支付)而不接受許可協議?注:我已經有一個「拒絕」按鈕,並按下此按鈕會彈出一個Toast(),表示您必須接受該協議才能使用該應用程序。該對話框因此一直持續到接受按下。 – CaptainProg