2011-04-02 78 views
16

我有一個自定義對話框,當我嘗試獲取EditText的值時,它返回null。findviewbyid在對話框中返回空值

此行返回null

EditText et = (EditText)findViewById(R.id.username_edit); 

這裏是將其全部的代碼。

protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case DIALOG_TEXT_ENTRY: 
     LayoutInflater factory = LayoutInflater.from(this); 
     final View textEntryView = factory.inflate(R.layout.alert_dialog_text_entry, null); 
     return new AlertDialog.Builder(TicTacToe.this) 
      //.setIconAttribute(android.R.attr.alertDialogIcon) 
      .setTitle(getTitleText()) 
      .setView(textEntryView) 
      .setPositiveButton("JOIN GAME", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        try 
        { 
         EditText et = (EditText)findViewById(R.id.username_edit); 
          playerName = et.getText().toString(); 
        } 
        catch (Exception e) 
        { 
        } 
       } 
      }) 
      .create(); 
    } 
    return null; 
} 

回答

36

試試這個:

EditText et = (EditText)textEntryView.findViewById(R.id.username_edit); 

你必須知道在哪兒查看找到ID。否則,它會嘗試找到從setContentView膨脹的XML佈局視圖的ID(通常在onCreate申報)

+0

+1偉大的工作人。 – Jacob 2013-03-07 13:01:14

+0

謝謝!爲我工作以及 – Urbanleg 2013-06-15 15:10:52

+0

謝謝你保存了一天:) – orchidrudra 2015-04-23 20:38:23

2

我有同樣的問題,提出了自己在下面的代碼片段:

final Dialog dialog = new Dialog(this); 

dialog.setContentView(R.layout.addbank_dialog); 
dialog.show(); 

Button btnSaveBank = (Button)dialog.findViewById(R.id.btnSaveBank); 

final EditText etBankName = (EditText)dialog.findViewById(R.id.etBankName); 

btnSaveBank.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     try{ 
      String bank = etBankName.getText().toString(); 
      SharedCommonData.dbOps.saveBankInDB(bank); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
     Toast.makeText(SharedCommonData.context, "Bank Saved", Toast.LENGTH_SHORT); 
     refreshBanks(); 
     dialog.dismiss(); 
    } 
}); 

etBankName返回空值,但後來我用dialog.findviewbyid(R.id.etBankName)它工作。

20

在我的情況: 首先,我必須調用

dialog.show(),

,只有經過它,我能夠使用

dialog.findviewById (R.id.myID)。

如果我錯過了調用show(),比用findViewByID得到了一個null。

+1

這完全違反'AlertDialog.Builder.create()'似乎暗示,也是完全正確的。事實上,即使你不解引用null,只要調用'findViewById',當你最終調用'show()'時會引發不同的異常。謝謝。 – benkc 2015-07-17 21:08:00

+0

這太奇怪了...順便說一下,設備依賴。在調用Dialog.show()之前,我使用了'Dialog.findViewById()',並且它工作正常。 – Bondax 2016-04-19 13:05:02

6

我遇到過類似的問題。在我的情況下,我有一個自定義佈局的對話框,在這個佈局有一個radioButton。爲了解決這個問題,我使用了以下代碼:

View dialogLayout = factory.inflate(R.layout.dialog_layout, null); 
AlertDialog.Builder dialog = new AlertDialog.Builder(context); 
dialog.setView(dialogLayout); 

RadioButton radiobt = (RadioButton) dialogLayout.findViewById(R.id.radioBt);