导航 popBackStack 禁用到此片段的进一步导航



我在使用此代码使用组件时正在加载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我正在使用LiveDataViewModel推送此命令。返回到Fragment时,相同的命令再次推送到LiveData并再次触发导航返回,因此似乎没有发生导航。

解决方案是实施SingleLiveEventLiveData。它只推动了一次价值。

这是实现 https://github.com/android/architecture-samples/blob/dev-todo-mvvm-live/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/SingleLiveEvent.java 的链接

相关内容

  • 没有找到相关文章

最新更新