似乎沒有簡單的方法獲得一個警告框來返回一個簡單的值。
下邊的代碼不起作用(答案變量不能設置在監聽器裡,事實上它甚至都沒有編譯)
public static boolean Confirm(Context context) {
boolean answer;
AlertDialog dialog = new AlertDialog.Builder(context).create();
dialog.setTitle("Confirmation");
dialog.setMessage("Choose Yes or No");
dialog.setCancelable(false);
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int buttonId) {
answer = true;
}
});
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int buttonId) {
answer = false;
}
});
dialog.setIcon(android.R.drawable.ic_dialog_alert);
dialog.show();
return answer;
}
注意:很重要的是這個方法是自己包含的,也就是說,它不依賴於外部變量或者是構造。僅僅是調用它然後獲得你的值,true或者是false。
所以,應該怎麼做?簡單的想法就是返回true或者是false,但是這似乎比它自己來獲得這些值復雜得多。
而且,setButton有這個表單:
dialog.setButton(int buttonId, String buttonText, Message msg)
但是不知道怎麼用到它,這個消息應該發到哪,發給誰,哪個處理器是被用到的?
我想說我對我自己的答案很滿意,因為完全是靠我自己找到了一個簡單的方法。
但是事實是盡管我發現了返回一個值的方法(就是下邊的),但是它不起作用。
真正的問題是我想要一個同步的對話框,對話框在恢復代碼之前在dialog.show()
之後等待用戶來回答
在android中沒有這樣的beast。所有的對話框都是異步的,所以dialog.show()
只是在一些隊列中貼了這個對話框然後繼續。因此不能及時的得到答案。
對於所有的它的價值(沒什麼)下面你會在創建一個對話框的方法裡面找到怎麼設置一個值。也許這種技術還有其他的用途,不僅僅是在對話框的生命周期中。
下邊是一些相關信息,如果你用final boolean answer;
替換boolean answer;
我可能會說:它可能會在監聽器裡邊訪問內部變量,但是不可能為它分配一個新值,因為它是已經被聲明過了的了。=
這裡關鍵的問題出現了。
定義變量為
final boolean[] answer = new boolean[1];
一些人已經知道為什麼這個將起作用了。這裡的最後變量不是的單一的布爾數組,而是該數組本身。
所以現在你可以指定數組element [0]
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int buttonId) {
answer[0] = true;
}
});
. . .
return answer[0];
最終你能從你的方法中返回它。