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