Обратный вызов кнопки на спине не запускается после развлечения фрагмента (вращение)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Обратный вызов кнопки на спине не запускается после развлечения фрагмента (вращение)

Сообщение Anonymous »

контекст < /h1>
Я пытаюсь перехватить поведение кнопки по умолчанию обратной кнопки, чтобы иметь возможность добавлять подтверждающие сообщения («Вы уверены, что хотите выйти?

Код: Выделить всё

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();
}
in oncreate :

Код: Выделить всё

getOnBackPressedDispatcher().addCallback(this,
new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
if (!navController.popBackStack()) {
showLogoutConfirmationDialog();
}

}
});
внутри ProfileFragment :

Код: Выделить всё

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();
}
in onviewcreated :
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»