Navigation popBackStack 禁用进一步导航到此 Fragment
Posted
技术标签:
【中文标题】Navigation popBackStack 禁用进一步导航到此 Fragment【英文标题】:Navigation popBackStack disables further navigation to this Fragment 【发布时间】:2020-02-09 02:09:57 【问题描述】:我在将Navigation
组件与此代码一起使用时加载了一个片段,它可以工作。
findNavController().navigate(R.id.menu_nav_graph, bundleOf("menuItem" to item))
我想在按钮单击时关闭片段,我为此使用此代码
findNavController().popBackStack()
应用程序导航到上一个片段,但是当我尝试使用上面的代码再次导航到弹出的片段目标时,应用程序到达了代码并且没有任何反应。片段未加载。所以导航代码被执行但片段没有打开。当我不使用 popBackStack
而不是使用 onClick 侦听器时,也会发生同样的情况
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)
如何在按钮单击时关闭 Fragment 并能够导航到相同的目的地?
【问题讨论】:
你的意思是findNavController().navigate(R.id.menu_nav_graph, bundleOf("menuItem" to item))
从上一个片段返回后无法工作?
是的,正是我的意思,它只适用于第一个导航操作,当你退出它时它不会再次
【参考方案1】:
经过更多调试后,我发现了根本原因,问题不在于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的链接
【讨论】:
以上是关于Navigation popBackStack 禁用进一步导航到此 Fragment的主要内容,如果未能解决你的问题,请参考以下文章
BottomNavigation popBackStack() 导航到 startDestination 而不是上一个片段
为啥popbackstack会调用fragment的onCreateView?
popBackStack(int id,int flags)函数中的参数