Android AlertDialog с DialogFragment: не закрывать диалоговое окно, даже если нажата кнопка «ОК»

У меня есть AlertDialog с пользовательским макетом (только EditText), и я хочу проверить данные при нажатии кнопки OK. Если проверка не удалась, я не хочу закрывать диалог.

Я использую кнопки диалога по умолчанию (положительные и отрицательные). Если я использую "setPositiveButton ("", new DialogInterface.OnClickListener()...", диалоговое окно всегда закрывается. Я видел несколько сообщений, и они сказали, что прослушиватель onClick должен быть переопределен, но я не могу заставить его работать , Это код, который я нашел:

Button theButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
theButton.setOnClickListener(new CustomListener(dialog));

Поскольку он говорит, что это должно быть сделано ПОСЛЕ показа диалога, я поместил этот код в свою активность, а не в свой DialogFragment, но если я использую mDialogFragment.getDialog(), он всегда возвращает значение null.

Это часть моего фрагмента диалога:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    builder.setTitle(R.string.new);

    LayoutInflater inflater = getActivity().getLayoutInflater();
    dialogView = inflater.inflate(R.layout.edit_license, null);

    builder.setView(dialogView)

    // Add action buttons
    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {

        }
    })
    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            MyDialogFragment.this.getDialog().cancel();
        }
    }); 

    return builder.create();

}

И в своей деятельности я делаю следующее:

DialogFragment dialog = new MyDialogFragment(true, null);
dialog.show(getSupportFragmentManager(), "EditLicenseDialogFragment");

AlertDialog alertDialog = (AlertDialog)dialog.getDialog();
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
btnPositive.setOnClickListener(new CustomListener(alertDialog));

... 

class CustomListener implements View.OnClickListener {
    private final Dialog dialog;
    public CustomListener(Dialog dialog) {
        this.dialog = dialog;
    }
    @Override
    public void onClick(View v) {
        ...
    }
}

Как я уже сказал, (AlertDialog)dialog.getDialog(); всегда возвращает ноль. Это почему? Как я могу избежать закрытия диалогового окна, если проверка не в порядке?

Спасибо!


person PX Developer    schedule 12.02.2013    source источник


Ответы (2)


вот текст из ссылки на DialogFragment:

Фрагмент, отображающий диалоговое окно, плавающее поверх окна активности. Этот фрагмент содержит объект Dialog, который отображается соответствующим образом в зависимости от состояния фрагмента. Управление диалоговым окном (решение, когда показывать, скрывать или закрывать его) здесь должно осуществляться через API, а не с помощью прямых вызовов диалогового окна.

Вместо вызова getDialog().dismiss() следует выполнить dismiss()

person Tobrun    schedule 12.02.2013
comment
Интересный. А как насчет функции getButton? Это не на DialogFragment, и если я попытаюсь получить диалог, он вернет ноль. - person PX Developer; 12.02.2013
comment
Диалог возвращает null, потому что mDialog, возвращаемый getDialog, еще не создан. Решением было бы реализовать другие методы жизненного цикла внутри DialogFragment, которые происходят после функции onCreateDialog/show. Но на самом деле это не проблема, вы просто определяете clickListener внутри диалогового фрагмента (как сейчас). Но не выполняйте диалоговые операции в диалоге, а в диалоговом фрагменте, при этом вам не нужно вызывать getDialog() - person Tobrun; 12.02.2013

Это решение работает для меня. Диалог уже виден в onResume, так что это хорошее место, чтобы получить доступ к кнопкам и заменить слушателей.

public class XYZFragment extends DialogFragment {
   ...

    @Override
    public void onResume() {
        super.onResume();

        AlertDialog dialog = (AlertDialog)getDialog();

        Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
        positiveButton.setOnClickListener(new View.OnClickListener() {                  
            @Override
            public void onClick(View onClick) {
            ...
            }
        });
    }
}
person Michal Faber    schedule 08.04.2013
comment
теперь не вижу кнопку ок - person Rakesh Yadav; 06.06.2017