#android #kotlin
Вопрос:
Я слушаю назад кнопку, нажатую на моем фрагменте следующим образом
val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
podcastViewModel.removePodcast();
// THEN - continue navigating
}
Как я могу выполнить такую задачу, как removePodcast();
затем, после продолжения навигации назад. Приведенный выше код перехвата кнопки «Назад» нажат, но не продолжается
Ответ №1:
Вы отменяете обычное поведение при нажатии назад, поэтому оно не возвращается. Вам нужно позвонить parentFragmentManager.popBackStack()
(или findNavController().popBackStack()
если вы используете навигационный компонент).
Другой вариант-выполнить обратный вызов setEnabled = false
после удаления подкаста (это означает, что обработчик не будет вызван в следующий раз), а затем немедленно запустить событие с обратным нажатием activity?.onBackPressed()
. Это будет работать с поведением по умолчанию (если вы не добавили больше диспетчеров! В этом случае он перейдет к следующему)
редактировать: Я сам использовал этот popBackStack
материал, но, возможно, было бы лучше использовать подход «отключить диспетчера и повторно запустить» в целом. Просто потому, что стандартное поведение может измениться (многое происходит с обратными стеками и разработкой навигации), поэтому жесткое кодирование popBackStack
вызова может привести к проблемам в будущем.
Я не знаю, какова официальная линия, хотя — в документах есть что сказать:
Изменение включенного состояния на
OnBackPressedCallback
настоятельно рекомендуется для временных изменений, поскольку оно поддерживает порядок, описанный выше, что особенно важно, если у вас есть обратные вызовы, зарегистрированные у нескольких разных владельцев вложенного жизненного цикла.
но это больше связано с временным изменением реакции на нажатие назад, а не с обработкой одного нажатия и возней, запуском нескольких событий для создания определенного стандартного поведения
Ответ №2:
Просто нашел способ! Обратный вызов должен быть отключен или удален
val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
podcastViewModel.removePodcast();
this.remove()
activity?.onBackPressed()
}