Кнопка "Диалог" и кнопка "Назад"
Есть ли возможность перехватить кнопку ключа в 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");
}
Извините, я добавил фрагмент кода, который я использую, чтобы показать диалог.
Ответы
Ответ 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). Смотрите источник в диалоге