Подтвердить что ты не робот

Кнопка "Диалог" и кнопка "Назад"

Есть ли возможность перехватить кнопку ключа в DialogFragment? извините за наивный вопрос. onBackPressed моего FragmentActivity никогда не вызывается.

заблаговременно

    if (imageFile.exists()) {
            ShowPicDialog newFragment = ShowPicDialog.newInstance();
            FragmentTransaction ft = manager.beginTransaction();
            Fragment prev = manager.findFragmentByTag("picDialog");
            if (prev != null) {
                ft.remove(prev);
            }

            ft.addToBackStack("picDialog");
            newFragment.getArguments().putString("path", imageFile.getAbsolutePath());
            newFragment.show(ft, "picDialog");
        }

Извините, я добавил фрагмент кода, который я использую, чтобы показать диалог.

4b9b3361

Ответ 1

Трудно сказать, в чем проблема, поскольку вы не разместили какой-либо код. Но прежде всего я предполагаю, что вы не добавили DialogFragment в задний стек, вызвав метод addToBackStack FragmentTransaction, который вы используете, чтобы добавить свой фрагмент к активности.

На страницах документации по Android есть примеры, которые приводят примеры хорошего шаблона для использования диалогового окна "Диалог" в вашей деятельности.

Поскольку вы показываете диалоговое окно, созданный диалог получит ключевые события, а не родительскую активность. Итак, установите Dialog.OnKeyListener при создании фрагмента диалога и вызовите setCancelable(false) в Dialog, чтобы предотвратить его отключение. Затем вы можете обрабатывать обратный ключ в методе OnKeyListener onkey.

Ответ 2

Лучший способ обработки диалогового окна с помощью кнопки "Назад":

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    return new Dialog(getActivity(), getTheme()){
        @Override
        public void onBackPressed() {
            // On backpress, do your stuff here.
        }
    };
}

Ответ 3

Ответ Рахула Пундхира отлично работает, если вы не используете шаблон строителя. Если вы используете шаблон Builder в своем диалоговом окне, вы можете сделать это:

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog alertDialog = new AlertDialog.Builder(getContext())
                .setTitle(...)
                .setPositiveButton(...)
                .setNegativeButton(...)
                .setMessage(...)
                .create();

        alertDialog.setOnKeyListener((dialog, keyCode, event) -> {
            if (keyCode == KeyEvent.KEYCODE_BACK 
                && event.getAction() == KeyEvent.ACTION_UP) {
                // TODO do the "back pressed" work here
                return true;
            }
            return false;
        });

        return alertDialog;
    }

Это работает, манипулируя тем, как система вызывает onBackPressed() в первую очередь (игнорируя отслеживание и прослушивание ACTION_UP). Смотрите источник в диалоге