15

我需要一些建议;

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

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

1.重点听:我真的觉得它看起来很丑,我不认为这是一个通用的解决方案,所以我跳过了这个。

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

当我检查时fragmentManager,我看到它backStack是空的,并且片段交易发生在没有标签的情况下。

恕我直言,它不适合库的概念来进行findFragment某种操作以与当前片段进行某种交互,但我目前似乎无法找到解决方法。有什么建议么 ?

4

4 回答 4

11

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

在活动中:

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*/
于 2018-06-15T14:21:08.073 回答
3

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

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

将上面的代码放在 onViewCreated

于 2019-06-20T12:43:28.527 回答
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忽略它。

于 2019-03-10T11:26:56.960 回答
-1

我用这段代码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()
                        }
                    }
                }
            }
        }
    )
}
于 2021-06-18T15:58:48.750 回答