我在使用此代码使用组件时正在加载Navigation
片段并且它可以工作。
findNavController().navigate(R.id.menu_nav_graph, bundleOf("menuItem" to item))
我想在单击按钮时关闭片段,并为此使用此代码
findNavController().popBackStack()
该应用程序导航到上一个片段,但是当我尝试使用上面的代码再次导航到弹出的片段目标时,应用程序到达代码,但没有任何反应。片段未加载。因此,导航代码已执行,但片段未打开。当我不使用popBackStack
而是在onClick监听器中使用它时,也会发生同样的情况
activity?.onBackPressed()
同样的效果,应用程序到达导航线,没有崩溃,没有抛出异常,它只是没有打开片段。
同时,我的后退箭头导航正在工作,从片段中按回后,它确实会多次转到同一目的地。这让我感到困惑,因为我在onOptionsItemSelected
中使用相同的代码并且它有效,所以我不明白当我只是在单击按钮时调用onBackPressed()
时,它有什么不同。
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
android.R.id.home -> {
activity?.onBackPressed()
true
}
else -> super.onOptionsItemSelected(item)
}
如何在单击按钮时关闭片段并因此导航到同一目的地?
调试更多后,我发现了根本原因,问题不在于navigation
不执行导航,而在于navigation
库实现中的Fragment
生命周期。Fragment
在后退时没有被破坏,onBackPressed
在再次导航到同一目的地后立即触发。
为了触发onBackPressed
我正在使用LiveData
从ViewModel
推送此命令。返回到Fragment
时,相同的命令再次推送到LiveData
并再次触发导航返回,因此似乎没有发生导航。
解决方案是实施SingleLiveEvent
LiveData
。它只推动了一次价值。
这是实现 https://github.com/android/architecture-samples/blob/dev-todo-mvvm-live/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/SingleLiveEvent.java 的链接