[英]Yes/NO Alert Dialog box in Android
我想在onBackPressed()事件中在android中顯示一個警告對話框
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
//@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
//Yes button clicked
break;
case DialogInterface.BUTTON_NEGATIVE:
//No button clicked
break;
}
}
};
但是我在onBackPressed()事件中執行它時遇到錯誤
@Override
public void onBackPressed() {
super.onBackPressed();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
}
錯誤:“ com.java.mypkg泄漏了最初添加的窗口com.android.internal.policy.impl.PhoneWindow$DecorView@406c3798 ”
我錯過了什么嗎? 請幫忙。
是的,不要按照之前用戶的響應調用它。 super.onBackPressed();
將onStop
方法的Activity。 而不是onBackPressed();
您可以使用onKeyDown
滿足您的要求。 如果您需要在按下后退按鈕時打開AlertDialog
,您只需使用KeyEvent嘗試
例如 -
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch(keyCode)
{
case KeyEvent.KEYCODE_BACK:
AlertDialog.Builder ab = new AlertDialog.Builder(AlertDialogExampleActivity.this);
ab.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
break;
}
return super.onKeyDown(keyCode, event);
}
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
//Yes button clicked
break;
case DialogInterface.BUTTON_NEGATIVE:
//No button clicked
break;
}
}
};
當您覆蓋onKeyDown
方法時,它將使用您的KEYCODE_BACK檢測返回鍵
希望這對你有所幫助。
不要調用super.onBackPressed();
因為它會調用活動的onStop方法。
並且在已完成的活動上顯示對話框將泄露窗口。
繼續為這條線提供適當的上下文::
AlertDialog.Builder builder = new AlertDialog.Builder(ActivityName.this);
像這樣關閉警報對話框。
new AlertDialog.Builder(ActivityName.this) .setMessage("You have to Login first to apply.\\nWant to login ?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Perform Your Task Here--When Yes Is Pressed. dialog.cancel(); } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Perform Your Task Here--When No is pressed dialog.cancel(); } }).show();
窗口泄漏的錯誤是在:::
在具有不同上下文的Activity中打開具有不同上下文的新窗口。
退出活動時,窗口或對話框未正確關閉。
我的alertdialog方法:
public void message_dialog_yes_no (Activity activity, String msg, DialogInterface.OnClickListener yesListener) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage(msg)
.setCancelable(false)
.setPositiveButton("Yes", yesListener)
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}})
.show();
}
聲明這個方法之后我可以這樣稱呼它:
DialogInterface.OnClickListener yesListener;
yesListener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//codes
}
};
message_dialog_yes_no(this, "Confirm delete?" , yesListener);
如果要執行默認操作(即實際返回), super.onBackPressed()
應調用super.onBackPressed()
如果要super.onBackPressed()
則不應調用super.onBackPressed()
。
有關如何正確覆蓋onBackPressed()
的示例,請參閱此鏈接 。
我們通常重寫onBackPressed()
以在退出Activity時執行某些條件。 這意味着我們實際上是通過正常執行Back Press事件,這只是super.onBackPressed
。 因此,將其置於覆蓋方法中意味着它還將遵循按下后退鍵時將執行的默認執行,並且還將執行我們自己的方法。
但是在你的情況下,因為你試圖在調用超類后顯示一個AlertDialog,你的Activity上下文不再可用,這意味着你的Alert Dialog沒有窗口顯示自己,因此泄漏的窗口錯誤。
在這種情況下,您已刪除超類調用。 簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.