我需要一些建议;
我正在试验导航库。我有一个有webView的片段。我想检查它是否canGoBack
并且如果可以的话就这样做,否则不会干扰。
1。接口方法:由于导航处理事务,我不再手动创建片段的实例,我可以将其指定为活动中的监听器。
1。重点聆听:我认为它看起来很难看,我认为它不是一般的解决方案,所以我跳过这个。
我需要一些关于如何使用导航库的意见。当您尝试从currentDestination
获取navController
时,它的NavigationDestination
对象会提供有关当前片段的信息,例如xml中给出的标签。
当我检查fragmentManager
时,我发现backStack
是空的&片段事务发生时没有标记。
恕我直言,它不适合图书馆的概念来进行findFragment
种操作以与当前片段进行某种程度的交互,但我似乎无法找到解决问题的方法。时刻。有什么建议吗?
答案 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)
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()
}
}
}
}
}
)
}