我有一个对话框,其中包含两个edittextbox。
当我填写字段并单击提交按钮时,我需要将值保存在数据库中。我试图获取在字段中输入的值,但引发了空指针异常。
我的代码如下
View v = getLayoutInflater().inflate(R.layout.sample, null);
new AlertDialog.Builder(Context)
.setTitle(R.string.Details)
.setView(v)
.setNegativeButton(R.string.Cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
}
})
.setPositiveButton(R.string.Submit,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
final EditText txtname=(EditText)findViewById(R.id.editText1);
final EditText txtnumber=(EditText)findViewById(R.id.editText2);
Save(txtname.getText().toString(),txtnumber.getText().toString());
}
当我调试并检查时,它将txtname和txtnumber值显示为空。我哪里出错了?我正在使用布局来显示字段
布局是,
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TableRow>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="Name" />
<EditText
android:id="@+id/editText1"
android:layout_width="195dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:ems="10"
android:hint="FirstName LastName"
android:inputType="textPersonName" />
</TableRow>
<TableRow>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="Phone" />
<EditText
android:id="@+id/editText2"
android:layout_width="190dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:ems="10"
android:inputType="number"
android:maxLength="10" />
</TableRow>
请帮我解决这个例外!!
答案 0 :(得分:5)
您的txtname
和txtnumber
为空
即
final EditText txtname=(EditText)findViewById(R.id.editText1);
final EditText txtnumber=(EditText)findViewById(R.id.editText2);
当您尝试访问空引用时,您将获得NullPointerException
尝试让他们像这样
final EditText txtname=(EditText)v.findViewById(R.id.editText1);
final EditText txtnumber=(EditText)v.findViewById(R.id.editText2);
答案 1 :(得分:1)
我认为你正在寻找错误的地方。尝试使用:
final View v = getLayoutInflater().inflate(R.layout.sample, null);
而不是
final EditText txtname=(EditText)v.findViewById(R.id.editText1);
final EditText txtnumber=(EditText)v.findViewById(R.id.editText2);
在“v”视图中找到EditText。
答案 2 :(得分:1)
由于你还没有提供完整的代码和堆栈跟踪,我猜错了,但我认为它是正确的: 您是从活动的内容视图中使用findViewById而不是从膨胀的视图中获取编辑文本。 变化:
findViewById(R.id.editText1);
findViewById(R.id.editText2);
到
v.findViewById(R.id.editText1);
v.findViewById(R.id.editText1);
答案 3 :(得分:1)
您需要从dialod的布局中获取视图
public void onClick(DialogInterface dialog,
int which) {
final EditText txtname=(EditText)dialog.findViewById(R.id.editText1);
final EditText txtnumber=(EditText)dialog.findViewById(R.id.editText2);
Save(txtname.getText().toString(),txtnumber.getText().toString());
}
答案 4 :(得分:1)
请检查资源ID,它也会为NPE做出原因。
答案 5 :(得分:1)
findViewById
与活动相关。您的视图不在活动中,而是在对话框中。你需要打电话
dialog.findViewById
来自这个范围。