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 我正在使用LiveDataViewModel 推送此命令。当返回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)函数中的参数

如何知道何时调用了`navController.popBackStack()`?

片段 PopBackStack

在 Popbackstack() 上调用方法