2011-06-14 33 views
0

我有一個提醒對話框,我有2個文本字段,然後是正面和負面的按鈕。在我調用Show之前無法在AlertDialog中找到按鈕。爲什麼?不應該在CREATE之後可用?

我試圖在最終文本字段上設置nextFocusDown,總是成爲正面的按鈕。

正面和負面的按鈕在第二個文本框的下方彼此疊放,如果用戶輸入的光標在左側按鈕上,則下一個焦點將移動到左側按鈕,如果它位於右側按鈕上,移到右邊的按鈕。

於是我就用我的警報生成器來創建我的警告對話框,然後試圖調用

myAlertDialog.getButton(DialogInterface.BUTTON_POSITIVE); ,然後將ExitText字段設置爲該按鈕的ID爲nextFocusDownId。

並且在向用戶顯示警報之前這樣做,所以我沒有任何競速條件的機會。

唉,ad.getButton每次都會返回NULL。當我將這些代碼行移動到ad.show()調用之後時,一切正常。

所以我想我的問題是,有人可以向我解釋這一點。我會想,一旦我設置了正確的按鈕,並創建了視圖應該存在但不可見的AlertDialog ...顯然情況並非如此,所以沒有什麼是DisplayWidget的創建,直到視圖實際顯示爲一般的經驗法則?當視圖膨脹時,我可以在顯示它們之前找到它們中的對象。那麼關於這個的一般經驗法則是什麼?

+0

這是Android版,對不起。 – user756212 2011-06-14 17:05:27

回答

0

我認爲你的最終陳述/問題是正確的。在對話框上呼叫show()膨脹並顯示視圖。因此,有意義的是,除非顯示對話框,否則無法與代碼中的視圖交互。如果您的代碼是在調用show()之後直接操作對話框,那麼我不會看到競爭條件太多。

具體而言,這裏是javadoc中說:

show() - 啓動對話框,並在屏幕上顯示出來。

因此,在調用show()之前,對話框不是「開始」的。

0

下面是填充對話框的代碼示例。可能是你應該使用類似的方法,然後設置你的按鈕:

LayoutInflater li = LayoutInflater.from(ctx); 
View view = li.inflate(R.layout.promptdialog, null); 
//get a builder and set the view 
AlertDialog.Builder builder = new AlertDialog.Builder(ctx); 
builder.setTitle("Prompt"); 
builder.setView(view); 
0

這些都是使用AlertDialog.Builder的侷限性。如所暗示的,您的觀點尚未充實。這並不一定意味着在顯示對話框之前無法訪問這些視圖。您可以自行膨脹視圖並隨意修改。請參閱docs on custom dialogs。您可以誇大自己的觀點,然後使用setViewDialog設置View。不幸的是,這確實否定了Builder提供的許多簡單性。

相關問題