2011-05-22 8 views
2

私はスレッドを検索しましたが、今まで私が探しているものが見つかりませんでした。 カスタムアラートダイアログを作成しましたが、私はそれを使ってほとんど何でもできます。カスタムダイアログは3つのTextViewと3つのEditTextで構成されていますが、EditTextを取得する必要があるときはいつでも、nullコンポーネントが得られます。AlertDialogの中のEditTextは常にnullです

私はとのEditTextフィールドを取得しようとしている

<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" 
    > 

私のXMLファイルから:

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

しかし、これを行う場合、最初の行がうまく機能し、第二の故郷がクラッシュしますコントロールはnullです。 これは、私が必要とするカスタムAlertDialogを作成するために使用するOverwriteメソッドです。

@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説明のために! –

2

findViewByIdを使用すると、暗黙のうちに現在のアクティビティが参照されます。あなたが変更する必要が一部は

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

代わりの

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

あなたはそれを解決しようとしています。また、AlertDialogオブジェクトの範囲をadに変更して、クラス内のビューを検索する前に、それがヌルでないことを確認する必要があります。 それはかなりです。

+1

私は 'レイアウト'が良いと思うので、ダイアログがDialogInterfaceのインスタンスであり、混乱する可能性があります。 – Ludevik

+0

こんにちは、ありがとうございました! Rgds –

+0

'Layout'は何よりも優れていますか? –

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); 

これは誰かに役立つことを望みます。

関連する問題