首页 > 解决方案 > 自定义 DialogFragment 说我的 EditTexts 为空

问题描述

我肯定在 onCreateDialog() 中做错了什么。侦听器工作正常,我可以传递我传入的主机片段字符串,但是,我收到错误消息,说我的 EditTexts 为空。另外,我在编码方面很新,所以请原谅混乱。

我应该从哪里获得对它们的引用?

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();


    builder.setTitle("Add Exercise");

    AlertDialog dialog = builder.create();
    final EditText name = (EditText) dialog.findViewById(R.id.ex_name);
    final EditText sets = (EditText) dialog.findViewById(R.id.ex_sets);
    final EditText reps = (EditText) dialog.findViewById(R.id.ex_reps);
    final EditText weight = (EditText) dialog.findViewById(R.id.ex_weight);

    builder.setView(inflater.inflate(R.layout.dialog_add_exercise, null))
    .setPositiveButton("Add", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            // User clicked Add button
            //listener.onDialogPositiveClick(AddExerciseDialogFragment.this);
            listener.getName(name.getText().toString().trim());
            listener.getName(name.getText().toString().trim());
            listener.getSets(Integer.parseInt(sets.getText().toString().trim()));
            listener.getReps(Integer.parseInt(reps.getText().toString().trim()));
            listener.getWeight(Double.parseDouble(weight.getText().toString().trim()));
            dismiss();
        }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            // User cancelled the dialog
            //listener.onDialogNegativeClick(AddExerciseDialogFragment.this);
            dismiss();
        }
    });

    //dialog.show();

    return builder.create();
}

标签: androidnullandroid-edittextdialog

解决方案


是的,您的 EditTexts 将始终为空。那是因为您在不包含它们的视图上使用 findViewById。注意这一行:

builder.setView(inflater.inflate(R.layout.dialog_add_exercise, null))

在您已经使用 findViewById 之后,您正在膨胀。这就是问题所在。

首先,获取您的视图根布局:

View view = inflater.inflate(R.layout.dialog_add_exercise, null);
然后,找到您的观点:

EditText editText = view.findViewById(R.id.editText);

最后,在你找到你想要的所有视图之后,使用你的构建器上的主视图根布局。

builder.setView(view)...

推荐阅读