Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AlertDialog内的EditText始终为空_Android_Android Alertdialog_Android Edittext - Fatal编程技术网

Android AlertDialog内的EditText始终为空

Android AlertDialog内的EditText始终为空,android,android-alertdialog,android-edittext,Android,Android Alertdialog,Android Edittext,我已经搜索过了,但是到目前为止我还没有找到我要找的东西。 我创建了一个显示的自定义警报对话框,我几乎可以用它做任何事情。它的自定义对话框由3个文本视图和3个EditText组成,但每当我需要获取EditText时,就会得到一个空组件 从我的xml文件 <TextView android:layout_alignParentTop="true" android:id="@+id/txtAccName" android:layout_width="fill_parent"

我已经搜索过了,但是到目前为止我还没有找到我要找的东西。 我创建了一个显示的自定义警报对话框,我几乎可以用它做任何事情。它的自定义对话框由3个文本视图和3个EditText组成,但每当我需要获取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"
    >
但在执行此操作时,第一行运行良好,第二行导致崩溃,控件为空。 这是我用来创建所需的自定义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;
}

非常感谢您的帮助。

当您使用
findViewById
时,您会暗指当前活动。你必须改变的部分是

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

EditText txtAccName = (EditText) findViewById(R.id.txtEditName);
当您尝试解决它时。在搜索视图之前,还必须将
AlertDialog
对象
ad
的范围更改为类范围,并确保其不为null。
差不多就是这样。

注意所有方法调用是如何在匿名内部类中解析的

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

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

EditText txtAccName = (EditText) findViewById(R.id.txtEditName);
正在解析为
活动#findViewById
。但是对话框的布局没有附加到活动窗口,而是附加到对话框。您可以通过多种方式找到正确的视图引用,但在您的情况下,最简单的方法可能是从您膨胀的布局的根目录进行搜索:

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

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

希望这对其他人有所帮助。

我认为“布局”更好,因为dialog是DialogInterface的实例,这可能会让人困惑。您好,非常感谢您的快速帮助!!Rgds
Layout
比什么好?如果不需要另一个
ad
类字段,使用
Layout
进行搜索是一个更干净的解决方案。它如何更干净?它是方法中的最后一个字段。您可以将其或对话框设置为类字段。
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);