gpt4 book ai didi

android - 导航 popBackStack 禁止进一步导航到该 fragment

转载 作者:行者123 更新时间:2023-12-04 23:55:24 26 4
gpt4 key购买 nike

我在使用带有此代码的 Navigation 组件时加载了一个 Fragment,它可以正常工作。

findNavController().navigate(R.id.menu_nav_graph, bundleOf("menuItem" to item))

我想在单击按钮时关闭 Fragment,为此我使用了这段代码

findNavController().popBackStack()

应用程序导航到上一个 fragment ,但是当我尝试使用应用程序上方的代码再次导航到弹出的 fragment 目的地时,应用程序到达代码并且没有任何反应。 fragment 未加载。因此导航代码已执行但 fragment 未打开。当我不使用 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 并因此能够导航到同一目的地?

最佳答案

经过更多调试后,我找到了根本原因,问题不在于 navigation 没有执行导航,而是我猜测 navigation< 中的 Fragment 生命周期 库实现。后退时 Fragment 没有被销毁,并且 onBackPressed 在再次导航到同一目的地后立即被触发。

要触发 onBackPressed,我正在使用 LiveDataViewModel 推送此命令。当返回到 Fragment 时,相同的命令再次被推送到 LiveData 并且导航返回被再次触发所以看起来没有导航发生。

解决方案是实现 SingleLiveEvent LiveData。它只插入了一次值(value)。

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

关于android - 导航 popBackStack 禁止进一步导航到该 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58343096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com