Aligator Aligator - 1 month ago 10
Android Question

EditText in DialogFragment always return empty string

I have implemented form in my dialog, and when positive button is clicked I create new object to ma database. I've created global variable for EditText's but still not work. Where I want get text value from them I always get empty string.

here is code:

EditText name, desc;


@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
view = inflater.inflate(R.layout.new_dialog, null);

name = (EditText) view.findViewById(R.id.workout_name);
desc = (EditText) view.findViewById(R.id.workout_description);


builder.setView(inflater.inflate(R.layout.new_dialog, null)).setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyDbHelper helper = new MyDbHelper (getActivity());
MyObj w = new MyObj ();

w.setName(name.getText().toString(););
w.setDescription(desc.getText().toString());
w.setLevel(1);

long id = helper.createWorkout(w);
Toast.makeText(getActivity(), id+"", Toast.LENGTH_LONG).show();

callback.onPositiveButtonClick();
}
}).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

callback.onNegativeButtonClick();

}
});

return builder.create();
}


Any ideas please?

Answer

In below code, you are inflating new_dialog layout and your name and desc EditTexts belong to this layout.

view = inflater.inflate(R.layout.new_dialog, null);

name = (EditText) view.findViewById(R.id.workout_name);
desc = (EditText) view.findViewById(R.id.workout_description);

But when you are setting the layout of the dialog you are setting new_workout_dialog. your name and desc do not belong to this layout.

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

Furthermore, even if you used new_dialog while setting the builders view, name and desc would still be irrelevant. Because you are completely creating a new view inside setView method.

Use the view variable as following:

builder.setView(view, null))