我已经搜索了线程,但到目前为止我还没找到我正在寻找的东西。 我创建了一个自定义警报对话框,我可以用它做任何事情。它自定义对话框由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"
>
我正在尝试使用:
获取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;
}
非常感谢任何帮助。
答案 0 :(得分:11)
记下在匿名内部类中如何解析所有方法调用。
findViewById
是一种存在于视图和活动中的方法。活动中此方法的版本在活动窗口的视图层次结构中搜索视图。视图上的版本搜索该视图实例和所有附加的子项。
您对有问题的代码行的调用:
EditText txtAccName = (EditText) findViewById(R.id.txtEditName);
正在解析为Activity#findViewById
。但是您的对话框布局未附加到您的活动窗口,它已附加到对话框中。您可以通过多种方式找到正确的视图参考,但在您的情况下,最简单的可能是从您夸大的布局的根目录中搜索:
EditText txtAccName = (EditText) layout.findViewById(R.id.txtEditName);
答案 1 :(得分:2)
当您使用findViewById
时,您隐式引用当前活动。你需要改变的部分是
EditText txtAccName = (EditText) ad.findViewById(R.id.txtEditName);
而不是
EditText txtAccName = (EditText) findViewById(R.id.txtEditName);
当您尝试解决它时。在搜索其中的视图之前,您还必须将AlertDialog
对象ad
的范围更改为类范围,并确保它不为null。
这就是它。
答案 2 :(得分:1)
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);
希望这有助于某人。