Я пытаюсь перехватить поведение кнопки по умолчанию обратной кнопки, чтобы иметь возможность добавлять подтверждающие сообщения («Вы уверены, что хотите выйти?
Код: Выделить всё
ActivityЯ устанавливаю обратный вызов на действие . Когда в заднем стеке нет ничего, и приложение закроется, появляется диалоговое окно, чтобы подтвердить, что вы хотите выйти в систему. Этот обратный вызов гарантируется, что если в профиле есть непреднамеренные изменения в профиле, который вы их применяете или отмените. Модель .
[*] Образ вызовов деятельности в методе Oncreate .
Обращение к фрагменту находится в методе onviewcreated . ProfileFragment , внесите изменение (так что диалог фактически показывается), поверните устройство (вызывая уничтожение и воссоздание) , а затем нажмите назад, он просто выполняет поведение по умолчанию обратного нажатого: оно восходит к предыдущему фрагменту (то есть пользователь дома). Как будто обратный вызов не добавляется снова. Это также фактически нарушает кнопку UP на панели инструментов ; Это больше ничего не делает. Приятно отметить, что поведение кнопки UP еще вообще не модифицировано. Иногда, когда я протягиваю нажатие назад и вращаю устройство, приложение сбои, говоря, что оно не может найти дополнительного. Скорее всего, это связано с тем, что у меня не было этой проблемы, прежде чем я добавил обратные вызовы. SavedInStanceState ? Class = "Lang-Java PrettyPrint-Override">
Код: Выделить всё
private void showLogoutConfirmationDialog() {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("Logout")
.setMessage("Going back will log you out of the app. Are you sure you want to continue?")
.setPositiveButton("Logout", (dialogInterface, which) -> {
dialogInterface.dismiss();
UserLaunchNavigationHelper.logout(this);
})
.setNegativeButton("Cancel", (dialogInterface, which) -> dialogInterface.dismiss())
.create();
dialog.show();
}
Код: Выделить всё
getOnBackPressedDispatcher().addCallback(this,
new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
if (!navController.popBackStack()) {
showLogoutConfirmationDialog();
}
}
});
Код: Выделить всё
private void attemptExit(Runnable proceedAction) {
if (Boolean.TRUE.equals(profileViewModel.hasAnyChanges.getValue())) {
showConfirmDialog(proceedAction);
} else {
proceedAction.run();
}
}
private void showConfirmDialog(Runnable proceedAction) {
new AlertDialog.Builder(requireContext())
.setTitle("Discard changes?")
.setMessage("You have unsaved changes. Do you want to save or discard?")
.setPositiveButton("Save", (d, w) -> {
applyChanges();
proceedAction.run();
})
.setNegativeButton("Discard", (d, w) -> {
profileViewModel.resetChanges();
proceedAction.run();
})
.setNeutralButton("Cancel", null)
.show();
}
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
attemptExit(() -> {
setEnabled(false);
requireActivity().getOnBackPressedDispatcher().onBackPressed();
setEnabled(true);
});
}
});
< /code>
Что я попробовал < /h1>
Я попытался изменить, где были добавлены обратные вызовы, которые не помог Приложение.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... n-rotation
Мобильная версия