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

时间:2019-10-11 14:11:47

标签: android android-fragments navigation android-jetpack android-navigation

我正在使用带有此代码的Navigation组件加载片段,并且可以正常工作。

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

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

findNavController().popBackStack()

该应用程序导航至上一个片段,但是当我尝试使用该应用程序上方的代码再次导航至弹出的Fragment目标时,该代码将无效。片段未加载。因此,导航代码已执行,但片段未打开。当我将它与onClick侦听器一起使用而不是使用popBackStack时,也会发生相同的情况

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)
        }

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

1 个答案:

答案 0 :(得分:0)

更多调试后,我找到了根本原因,问题不在于navigation未执行导航,而是我猜想Fragment库实现中的navigation生命周期。退回时,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

的链接