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

Есть ли возможность перехватить кнопку DialogFragment в 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"); } 

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

Solutions Collecting From Web of "Кнопка «Диалог» и «Назад»"

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

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

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

Лучший способ обработки диалогового окна с кнопкой «Назад»:

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

Ответ Рахула Пундхира отлично работает, если вы не используете шаблон строителя. Если вы используете шаблон 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() вызывает onBackPressed() (игнорируя отслеживание и прослушивание ACTION_UP). См. Источник в диалоге