Android onBackPressed обработка с помощью нового компонента навигации
Мне нужны некоторые предложения;
Я экспериментирую с навигационной библиотекой. У меня есть фрагмент, который имеет веб-просмотр. Я хочу проверить, если он может canGoBack
и сделать это, если он может, иначе не мешать.
1. Интерфейсный подход: поскольку Navigation обрабатывает транзакции, я больше не создаю экземпляр своего фрагмента вручную, который я могу назначить слушателем в действии.
1. Ключевое слушание: я действительно думаю, что это выглядит некрасиво, и я не думаю, что это общее решение, поэтому я пропускаю это.
Мне нужно несколько мнений о том, как это можно сделать с помощью библиотеки навигации. Когда вы пытаетесь получить currentDestination
из navController
, это объект NavigationDestination
который предоставляет информацию о текущем фрагменте, например, метку, заданную в xml.
Когда я инспектировать fragmentManager
, я вижу, что backStack
пуст и фрагмент сделка прошла без тега.
ИМХО, это не подходит для концепции библиотеки для выполнения findFragment
типа findFragment
для некоторого взаимодействия с текущим фрагментом, но я не могу найти пути до конца на данный момент. Какие-либо предложения?
Ответы
Ответ 1
Я нашел способ сделать это, как и раньше, с помощью интерфейса или базового класса фрагмента.
в деятельности:
override fun onBackPressed() {
val f = currentFragment
if (f !is BaseFragment || f.onBackPressed()) {
if (!findNavController(R.id.nav_host_fragment).navigateUp()) {
super.onBackPressed()
}
}
}
val currentFragment: Fragment?
get() = nav_host_fragment.childFragmentManager.findFragmentById(R.id.nav_host_fragment)
в BaseFragment:
open fun onBackPressed() = true /*or false if you want to prevent navigation*/
Ответ 2
OnBackPressedCallback может использоваться для этого:
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
activity?.addOnBackPressedCallback {
Log.d(TAG, "handleOnBackPressed")
//Your custom back behaviour
[email protected] false
}
}
Верните false
если вы хотите, чтобы поведение back по умолчанию выполнялось. Верните true
чтобы игнорировать это.
Ответ 3
Мы можем напрямую обрабатывать OnBackPressed из любого фрагмента.
requireActivity().onBackPressedDispatcher
.addCallback(viewLifecycleOwner, object: OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
//Handle back event from any fragment
}
})
Поместите код выше в onViewCreated