Пользовательская кнопка отмены в событии click фрагмента AlertDialog не обрабатывается - PullRequest
0 голосов
/ 10 октября 2018

Я создал диалоговое окно, макет которого, кнопки отмены и отправки полностью настроены, благодаря макету.Я хотел бы обработать нажатие на обе кнопки - в частности, мы рассматриваем в этом вопросе кнопку отмены.

Проблема

Когда кнопка отмены нажата, обработчик события щелчка неВыполнено.

Реализация

Пояснения

Я создал фрагмент диалога.Внутри я использую конструктор диалогов для создания своего диалога (как рекомендовано официальной документацией).Я установил обработчик щелчка для кнопки отмены и отменил диалоговое окно внутри.

Кнопка отмены активна (как указано в файле макета).Таким образом, событие обычно хорошо срабатывает.Кажется, что он не обрабатывается.

Sources

DialogFragment.java

NB: далее вывод "ok" не отображается, тогда как вывод отображаетсяссылка на кнопкуЭто означает, что функция, которая устанавливает обработчик события щелчка, выполняется (и что кнопка правильно получена из макета), но обработчик события щелчка не выполняется даже при щелчке.

    public class DialogFragment extends DialogFragment {

        @NonNull
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the Builder class for convenient dialog construction
            AlertDialog.Builder builder = new AlertDialog.Builder(Objects.requireNonNull(getActivity()));
            builder.setView(R.layout.dialog);
            View view = LayoutInflater.from(this.getContext()).inflate(R.layout.dialog, null);
            Dialog dialog = builder.create();
            setCancelButtonListener((Button) Objects.requireNonNull(view.findViewById(R.id.button_cancel)), dialog);
            return dialog;
        }
    private void setCancelButtonListener(Button button, final Dialog dialog) {
        System.out.println(button);
        button.setOnClickListener( new Button.OnClickListener() {

            @Override
            public void onClick(View v) {
                System.out.println("ok");
                dialog.cancel();
            }
        });
    }

}

dialog.xml ( т.е.: кнопка отмены в макете XML фрагмента)

    <Button
        android:clickable="true"

        android:id="@+id/button_cancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:layout_marginEnd="10dp"
        android:background="@drawable/background_button"
        android:text="@string/cancel"
        android:textColor="@color/colorRoyalRedLight"
        app:layout_constraintEnd_toStartOf="@+id/button3"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/text_4" />

Вопрос

Почему событие нажатия кнопки не обрабатывается?Как заставить это работать?

1 Ответ

0 голосов
/ 10 октября 2018

Взгляните на эти две строки из вашего кода:

builder.setView(R.layout.dialog);
View view = LayoutInflater.from(this.getContext()).inflate(R.layout.dialog, null);

Здесь вы присваиваете ID ресурса вашего макета для AlertDialog.Builder, чтобы он использовал его для заполнения AlertDialog '«настраиваемая» область.(Вы можете добиться того же эффекта, сначала надувая View, а затем вызывая AlertDialog.Builder.setView(View))

Затем вы можете LayoutInflater создать View, накачав тот же файл макета еще раз.Этот новый View доступен локальной переменной view в onCreateDialog(), но он никогда не добавляется ни к одному ViewGroup, поэтому он никогда не будет отображаться.Поскольку Button, содержащийся в этом View, не может быть нажат, его OnClickListener никогда не сработает.

Поэтому вы должны настроить AlertDialog следующим образом:

AlertDialog.Builder builder = new AlertDialog.Builder(Objects.requireNonNull(getActivity()));
View view = LayoutInflater.from(this.getContext()).inflate(R.layout.dialog, null);
builder.setView(view);
Dialog dialog = builder.create();
setCancelButtonListener((Button) Objects.requireNonNull(view.findViewById(R.id.button_cancel)), dialog);
return dialog;
...