Android onBackПрессованная обработка с новым компонентом навигации - PullRequest
0 голосов
/ 17 мая 2018

Мне нужны предложения;

Я экспериментирую с библиотекой навигации.У меня есть фрагмент, который имеет веб-просмотр.Я хочу проверить, если это canGoBack и сделать это, если это возможно, в противном случае не вмешиваться.

1.Интерфейсный подход : поскольку Navigation обрабатывает транзакции, я больше не создаю экземпляр своего фрагмента вручную, который я могу назначить слушателем в действии.

1.Ключевое слушание: Я действительно думаю, что это выглядит некрасиво, и я не думаю, что это универсальное решение, поэтому я пропускаю это.

Мне нужны некоторые мнения о том, как это можно сделать с помощью библиотеки навигации.Когда вы пытаетесь получить currentDestination из navController, это NavigationDestination объект, который предоставляет информацию о текущем фрагменте, такую ​​как метка, заданная в xml.

Когда я проверяю fragmentManager, я вижу, что backStack пуст и транзакция фрагмента произошла без тега.

ИМХО, это не подходит для концепции библиотеки для выполнения findFragment операций, чтобы как-то взаимодействовать с текущим фрагментом, но я не могу найти пути до конца в данный момент.Есть предложения?

Ответы [ 3 ]

0 голосов
/ 10 марта 2019

OnBackPressedCallback может использоваться для этого:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    activity?.addOnBackPressedCallback {
        Log.d(TAG, "handleOnBackPressed")
        //Your custom back behaviour
        return@addOnBackPressedCallback false
    }
}

Возврат false, если вы хотите, чтобы заданное по умолчанию поведение выполнялось. Верните true, чтобы игнорировать его.

0 голосов
/ 20 июня 2019

Мы можем напрямую обрабатывать OnBackPressed из любого фрагмента

requireActivity().onBackPressedDispatcher
        .addCallback(viewLifecycleOwner, object: OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            //Handle back event from any fragment 
        }
    })

Поместите код выше в onViewCreated

0 голосов
/ 15 июня 2018

Я нашел способ сделать это, как и раньше, с помощью интерфейса или базового фрагмента класса.

в Активности:

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*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...