所以我在我的应用程序中创建了一个自定义对话框,其中包含专门为数字格式化的EditText字段。我已设置代码以在用户单击按钮时启动Dialog。我遇到的问题是,当用户确认他们输入的信息时,我收到的错误是这样的:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
知道我可能做错了什么吗?这是我的Dialog Box inflater和按钮点击处理程序的完整代码。
public Dialog onCreateDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// Get the layout inflater
LayoutInflater inflater = this.getLayoutInflater();
Log.i("INFO","Creating Dialog...");
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(inflater.inflate(R.layout.goaldialog, null))
// Add action buttons
.setPositiveButton(R.string.SetAGoalButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
EditText et = (EditText) findViewById(R.id.GoalChooser);
Integer goalNumber = Integer.parseInt(et.getText().toString());
Log.i("INFO",Integer.toString(goalNumber));
dialog.dismiss();
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
builder.show();
return builder.create();
}
我是Android和Java的新手,所以请帮助。
UPDATE intrepidkarthi的答案解决了我的初始问题,但现在返回的字符串如下所示:
07-22 14:13:43.687 29972-29972/com.collusion.serviceassistant D/INFO﹕ [ 07-22 14:13:43.687 29972:29972 D/AndroidRuntime ]
Shutting down VM
我使用以下方法从EditText获取文本:
String goalNumberString = String.valueOf(et.getText());
答案 0 :(得分:3)
试试这个。
public Dialog onCreateDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// Get the layout inflater
LayoutInflater inflater = this.getLayoutInflater();
Log.i("INFO","Creating Dialog...");
View view = inflater.inflate(R.layout.goaldialog, null);
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(view)
// Add action buttons
.setPositiveButton(R.string.SetAGoalButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
EditText et = (EditText)view.findViewById(R.id.GoalChooser);
Integer goalNumber = Integer.parseInt(et.getText().toString());
globalVariable = goalNumber;
Log.i("INFO",Integer.toString(goalNumber));
dialog.dismiss();
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
builder.show();
return builder.create();
}
答案 1 :(得分:0)
使用setView()时将View实例捕获到变量中,然后可以使用findViewById来获取EditText:
final View view=inflater.inflate(R.layout.goaldialog, null);
builder.setView(view)
.setPositiveButton(R.string.SetAGoalButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
EditText et = (EditText)view.findViewById(R.id.GoalChooser);
Integer goalNumber = Integer.parseInt(et.getText().toString());
Log.i("INFO",Integer.toString(goalNumber));
dialog.dismiss();
}
})
答案 2 :(得分:0)
这是错误的指示:
EditText et = (EditText)onCreateDialog().findViewById(R.id.GoalChooser);
示例:
mEdit = (EditText)findViewById(R.id.edittext);
String content = mEdit.getText().toString();
答案 3 :(得分:0)
EditText et = (EditText)onCreateDialog().findViewById(R.id.GoalChooser);
把它放在这里:
public Dialog onCreateDialog() {
final EditText et = (EditText) findViewById(R.id.GoalChooser);
有用吗?我只是猜测,问题是你的EditText是空的,因为你从另一个上下文引用(你没有使用活动的上下文来实例化那个编辑文本)。
答案 4 :(得分:0)
当我们从布局xml文件中使用inflater.inflate时,我们需要在findViewById之前添加视图。
View view = inflater.inflate(R.layout.goaldialog, null);
EditText et =(EditText)view.findViewById(R.id.GoalChooser);