Android onBackPressed处理新的导航组件

Mel*_*Mel 13 android android-fragments kotlin android-architecture-components android-architecture-navigation

我需要一些建议;

我正在试验导航库.我有一个有webView的片段.我想检查它canGoBack是否可以这样做,否则不会干扰.

1.接口方法:由于Navigation正在处理事务,我不再手动创建片段的实例,我可以将其指定为活动中的监听器.

1.重点聆听:我认为它看起来很难看,我不认为这是一个通用的解决方案,所以我跳过这个.

关于如何使用导航库,我需要一些意见.当你试图从中获取currentDestinationnavController,它的NavigationDestination对象提供有关当前片段的信息,例如xml中给出的标签.

当我检查时fragmentManager,我发现它backStack是空的并且片段事务发生时没有标记.

恕我直言,它不适合库的概念来进行findFragment某种操作以与当前片段进行某种程度的交互,但我现在似乎无法通过它找到方法.有什么建议 ?

Ano*_*est 9

我找到了一种方法,像以前一样使用接口或基本片段类.

在活动中:

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)
Run Code Online (Sandbox Code Playgroud)

在BaseFragment中:

open fun onBackPressed() = true /*or false if you want to prevent navigation*/
Run Code Online (Sandbox Code Playgroud)


小智 5

我们可以直接处理任何片段的 OnBackPressed

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

将以上代码放入onViewCreated中