2011-05-22 69 views
2

我已經搜索了線程,但到目前爲止我還沒有找到我要找的內容。 我創建了一個顯示的自定義警報對話框,我幾乎可以用它做任何事情。它的自定義對話框由3個TextViews和3個EditText組成,但每當我需要獲取EditText時,我都會得到一個空組件。AlertDialog中的EditText總是爲空

從我的XML文件

<TextView android:layout_alignParentTop="true" 
    android:id="@+id/txtAccName" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Name" 
    android:textSize="23dp" 
    > 

</TextView> 
<EditText android:id="@+id/txtEditName" 
    android:layout_below="@+id/txtAccName" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="" 
    android:maxLength="20" 
    > 

我試圖讓與的EditText領域:

EditText txtAccName = (EditText) findViewById(R.id.txtEditName); 
    Log.d("#############################", "txtAccName="+txtAccName.getText().toString()); 

但是這樣做的時候,第一行效果很好,第二故鄉導致系統崩潰並且該控件爲空。 這是我用來創建我需要的自定義AlertDialog的覆蓋方法。

@Override 
protected Dialog onCreateDialog(int id) { 
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final View layout = inflater.inflate(R.layout.accountdialog, (ViewGroup) findViewById(R.id.accDialog)); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 

    builder.setNegativeButton(android.R.string.cancel,new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int whichButton) { 

     } 
     }); 
    builder.setPositiveButton(android.R.string.ok, 
      new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       EditText txtAccName = (EditText) findViewById(R.id.txtEditName); 
       //EditText txtAccCur = (EditText) findViewById(R.id.txtEditCur); 
       //EditText txtAccCountry = (EditText) findViewById(R.id.txtEditCountry); 
       //DBConn db = new DBConn(Accounts.this.getApplicationContext(), "msaverdb", null, 0); 
       Log.d("#############################", "CALLING db.insertAccount"); 
       Log.d("#############################", "txtAccName="+txtAccName.getText().toString()); 
       //db.insertAccount(txtAccName.getText().toString(), txtAccCountry.getText().toString(), 
       //  txtAccCur.getText().toString()); 
       Accounts.this.removeDialog(ACC_DIALOG); 
      } 
      }); 
    builder.setNegativeButton(android.R.string.cancel, 
      new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       Accounts.this.removeDialog(ACC_DIALOG); 
      } 
      }); 
    builder.setView(layout); 
    AlertDialog ad = builder.create(); 
    return ad; 
} 

任何幫助最受讚賞。

回答

11

請注意您的所有方法調用是如何在匿名內部類中解析的。

findViewById是一種存在於視圖和活動上的方法。活動中此方法的版本會在活動窗口的視圖層次結構中搜索視圖。視圖上的版本搜索該視圖實例和所有附加的子項。

您對有問題的代碼行電話:

EditText txtAccName = (EditText) findViewById(R.id.txtEditName); 

解析爲Activity#findViewById。但是,您的對話框的佈局未附加到您的活動窗口,它已附加到對話框。您可以在幾個方面正確的觀點引用,但在你的情況下,最簡單的可能是從你充氣的佈局根搜索:

EditText txtAccName = (EditText) layout.findViewById(R.id.txtEditName); 
+0

+1解釋! – 2013-05-22 19:43:36

2

當您使用findViewById時,您隱式引用當前活動。你必須改變的部分是

EditText txtAccName = (EditText) ad.findViewById(R.id.txtEditName); 

,而不是

EditText txtAccName = (EditText) findViewById(R.id.txtEditName); 
當您試圖解決它

。您還必須將AlertDialog對象ad的範圍更改爲類級別,並確保它不爲空,然後才能在其中搜索視圖。 這就是它。

+1

我認爲'佈局'更好,導致對話框是DialogInterface的實例,可以混淆 – Ludevik 2011-05-22 20:42:28

+0

嗨,非常感謝您的快速幫助! Rgds – 2011-05-22 20:43:05

+0

'佈局'比什麼更好? – 2011-05-22 20:45:24

0

的解釋由adamp是巨大的。但是這種方法對我不起作用。最簡單的方法是這樣的:

builder.setPositiveButton(R.string.positive, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        Dialog dialogView = (Dialog) dialog; 
        EditText et; 
        et = (EditText) dialogView.findViewById(R.id.addressinput); 

希望這可以幫助別人。