导航 popBackStack 禁止进一步导航到该 Fragment

Rai*_*ker 3 navigation android android-fragments android-navigation android-jetpack

Navigation我在使用带有此代码的组件时加载片段,并且它有效。

findNavController().navigate(R.id.menu_nav_graph, bundleOf("menuItem" to item))
Run Code Online (Sandbox Code Playgroud)

我想在单击按钮时关闭片段,我使用此代码

findNavController().popBackStack()
Run Code Online (Sandbox Code Playgroud)

应用程序导航到上一个片段,但是当我尝试使用上面的代码再次导航到弹出的片段目的地时,应用程序到达代码但没有任何反应。片段未加载。因此,导航代码已执行,但片段未打开。popBackStack当我不使用它与 onClick 监听器一起使用时,也会发生同样的情况

activity?.onBackPressed()
Run Code Online (Sandbox Code Playgroud)

同样的效果,应用程序到达导航线,没有崩溃,没有抛出异常,只是没有打开 Fragment。

同时,我的后退箭头导航正在工作,并且在从片段按回后,它确实多次转到同一目的地。这让我感到困惑,因为我使用相同的代码并且onOptionsItemSelected它可以工作,所以我不明白当我只调用onBackPressed()按钮单击时它有何不同。

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

如何在单击按钮时关闭片段并能够导航到相同的目的地?

Rai*_*ker 5

经过更多调试后,我发现了根本原因,问题不在于不navigation执行导航,而在于库实现Fragment中的生命周期navigationFragment后退时并没有被破坏,并且在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