Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 导航popBackStack禁用对此片段的进一步导航_Android_Android Fragments_Navigation_Android Jetpack_Android Navigation - Fatal编程技术网

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

Android 导航popBackStack禁用对此片段的进一步导航,android,android-fragments,navigation,android-jetpack,android-navigation,Android,Android Fragments,Navigation,Android Jetpack,Android Navigation,我在使用导航组件时加载了一个片段,该代码可以正常工作 findNavController().navigate(R.id.menu_nav_graph, bundleOf("menuItem" to item)) 我想在点击按钮的时候关闭这个片段,我用这个代码来实现它 findNavController().popBackStack() 应用程序导航到上一个片段,但当我尝试使用上面的代码再次导航到弹出的片段目标时,应用程序到达了代码,但什么也没有发生。片段未加载。因此,导航代码被执行,但片段

我在使用
导航
组件时加载了一个片段,该代码可以正常工作

findNavController().navigate(R.id.menu_nav_graph, bundleOf("menuItem" to item))
我想在点击按钮的时候关闭这个片段,我用这个代码来实现它

findNavController().popBackStack()
应用程序导航到上一个片段,但当我尝试使用上面的代码再次导航到弹出的片段目标时,应用程序到达了代码,但什么也没有发生。片段未加载。因此,导航代码被执行,但片段没有打开。当我在onClick侦听器中使用它而不是使用
popbackbackstack
时,也会发生同样的情况

activity?.onBackPressed()
同样的效果,应用程序到达导航行,没有崩溃,没有抛出异常,只是没有打开片段

同时,我的后向箭头导航正在工作,在按片段的后退按钮后,它确实多次到达同一目的地。这让我很困惑,因为我在
onOptionsItemSelected
中使用了相同的代码,而且它可以正常工作,所以我不明白在单击按钮时调用
onBackPressed()
有什么不同

override fun onOptionsItemSelected(item: MenuItem): Boolean =
        when (item.itemId) {
            android.R.id.home -> {
                activity?.onBackPressed()
                true
            }
            else -> super.onOptionsItemSelected(item)
        }

如何在点击按钮时关闭一个片段,从而能够导航到同一个目的地?

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

要触发
onBackPressed
我正在使用
LiveData
ViewModel
推送此命令。当返回到
片段
时,再次将相同的命令推送到
LiveData
,并再次触发导航返回,因此似乎没有发生导航

解决方案是实现
SingleLiveEvent
LiveData
。它只推了一次价值


这是到实现的链接

您的意思是
findNavController()。导航(R.id.menu\u nav\u graph,bundleOf(“menuItem”to item))
从上一个片段返回后不工作?是的,正是我的意思,它只对第一个导航操作有效,当您退出它时,它不会再次工作