获取自定义对话框中包含的EditText的值

时间:2014-07-22 18:57:02

标签: java android android-edittext

所以我在我的应用程序中创建了一个自定义对话框,其中包含专门为数字格式化的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());

5 个答案:

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