我正在使用带有此代码的Navigation
组件加载片段,并且可以正常工作。
findNavController().navigate(R.id.menu_nav_graph, bundleOf("menuItem" to item))
我想在单击按钮时关闭“片段”,为此我使用这段代码
findNavController().popBackStack()
该应用程序导航至上一个片段,但是当我尝试使用该应用程序上方的代码再次导航至弹出的Fragment目标时,该代码将无效。片段未加载。因此,导航代码已执行,但片段未打开。当我将它与onClick侦听器一起使用而不是使用popBackStack
时,也会发生相同的情况
activity?.onBackPressed()
效果相同,应用程序到达导航线,没有崩溃,没有引发异常,只是没有打开Fragment。
同时,我的后退箭头导航正在工作,并且从Fragment按下后确实多次到达相同的目的地。这使我感到困惑,因为我在onOptionsItemSelected
中使用了相同的代码,并且可以正常工作,所以当我在单击按钮时仅调用onBackPressed()
时,我不明白有什么不同。
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
android.R.id.home -> {
activity?.onBackPressed()
true
}
else -> super.onOptionsItemSelected(item)
}
如何在单击按钮时关闭片段并因此能够导航到相同的目的地?
答案 0 :(得分:0)
更多调试后,我找到了根本原因,问题不在于navigation
未执行导航,而是我猜想Fragment
库实现中的navigation
生命周期。退回时,Fragment
未被破坏,并且onBackPressed
在再次导航到相同目的地后立即被触发。
要触发onBackPressed
,我正在使用LiveData
从ViewModel
推送此命令。返回Fragment
时,同一命令再次推到LiveData
,导航又被触发,因此似乎没有导航在进行。
该解决方案正在实现SingleLiveEvent
LiveData
。它只推动了价值一次。