AlertDialog中的EditText始终为null

Ale*_*ves 3 android android-edittext android-alertdialog

我已经搜索了线程,但到目前为止我还没找到我正在寻找的东西.我创建了一个自定义警报对话框,我可以用它做任何事情.它自定义对话框由3个TextViews和3个EditText组成,但每当我需要获取EditText时,我得到一个null组件.

从我的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"
    >
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下内容获取EditText字段:

    EditText txtAccName = (EditText) findViewById(R.id.txtEditName);
    Log.d("#############################", "txtAccName="+txtAccName.getText().toString());
Run Code Online (Sandbox Code Playgroud)

但是当这样做时,第一行运行良好,第二行导致崩溃,控件为空.这是我用来创建我需要的自定义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;
}
Run Code Online (Sandbox Code Playgroud)

任何帮助都非常感谢.

ada*_*amp 14

记下在匿名内部类中如何解析所有方法调用.

findViewById是一种存在于视图和活动上的方法.活动中此方法的版本在活动窗口的视图层次结构中搜索视图.视图上的版本搜索该视图实例和所有附加的子项.

您对有问题的代码行的调用:

EditText txtAccName = (EditText) findViewById(R.id.txtEditName);
Run Code Online (Sandbox Code Playgroud)

正在解决Activity#findViewById.但是您的对话框布局未附加到您的活动窗口,它已附加到对话框中.您可以通过多种方式找到正确的视图参考,但在您的情况下最简单的可能是从您膨胀的布局的根目录中搜索:

EditText txtAccName = (EditText) layout.findViewById(R.id.txtEditName);
Run Code Online (Sandbox Code Playgroud)