使用新导航组件

时间:2018-05-17 14:20:15

标签: android android-fragments kotlin android-architecture-components android-architecture-navigation

我需要一些建议;

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

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

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

我需要一些关于如何使用导航库的意见。当您尝试从currentDestination获取navController时,它的NavigationDestination对象会提供有关当前片段的信息,例如xml中给出的标签。

当我检查fragmentManager时,我发现backStack是空的&片段事务发生时没有标记。

恕我直言,它不适合图书馆的概念来进行findFragment种操作以与当前片段进行某种程度的交互,但我似乎无法找到解决问题的方法。时刻。有什么建议吗?

4 个答案:

答案 0 :(得分:8)

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

在活动中:

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*/

答案 1 :(得分:0)

OnBackPressedCallback可以用于此:

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

如果要执行默认后退行为,请返回false。返回true忽略它。

答案 2 :(得分:0)

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

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

将上面的代码放入onViewCreated

答案 3 :(得分:0)

我用这段代码在片段中实现了onBackPressed

override fun onAttach(context: Context) {
    super.onAttach(context)

    requireActivity().onBackPressedDispatcher.addCallback(
        this,
        object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                if (binding.edtText.length() > 0){
                    binding.edtText.text.clear()
                } else {
                    if(!findNavController().navigateUp()) {
                        if (isEnabled) {
                            isEnabled = false
                            requireActivity().onBackPressed()
                        }
                    }
                }
            }
        }
    )
}