导航组件弹出行为无法正常工作

时间:2018-08-09 06:57:33

标签: android android-navigation android-jetpack android-architecture-navigation

在我正在构建的应用程序内部,我使用了单一活动架构,并决定使用Google的新导航组件在应用程序中导航。
尽管它显示出了很大的希望,但它也存在一些缺点,我的问题是其中之一。

假设我们有三个按顺序导航的片段,除了当我们在第三个片段上单击“后退”按钮时,我们想返回第一个片段。这是怎么回事:

Navigation from one to two to three

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_nav_graph.xml"
    app:startDestination="@id/firstFragment">

    <fragment
        android:id="@+id/firstFragment"
        android:name="com.hmomeni.navisample.FirstFragment"
        android:label="fragment_first"
        tools:layout="@layout/fragment_first" >
        <action
            android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.hmomeni.navisample.SecondFragment"
        android:label="fragment_second"
        tools:layout="@layout/fragment_second" >
        <action
            android:id="@+id/action_secondFragment_to_thirdFragment"
            app:destination="@id/thirdFragment"
            app:popUpTo="@+id/firstFragment" />
    </fragment>
    <fragment
        android:id="@+id/thirdFragment"
        android:name="com.hmomeni.navisample.ThirdFragment"
        android:label="fragment_third"
        tools:layout="@layout/fragment_third" />
</navigation>

这里的问题是,当我想第二次重复导航时,发生异常告诉我:

  

java.lang.IllegalArgumentException:导航目标   com.hmomeni.navisample:id / action_firstFragment_to_secondFragment是   该NavController未知

进一步的调查显示,单击返回按钮并返回到第一个片段后,navController.currentDestination仍然引用了错误的ThirdFragment,应该是FirstFragment

对此有任何帮助。

3 个答案:

答案 0 :(得分:1)

我认为这是问题here的重复内容-如果是,这是alpha04中的错误;尝试升级到alpha05。

答案 1 :(得分:0)

尽管我不称其为解决方案,但我发现了一些解决方法。
要解决此问题,您可以创建一个从ThirdFragment到自身的操作,然后在调用导航时检查navController.currentDestination

由于缺乏真正的解决方案,我不会接受这个答案。

答案 2 :(得分:0)

我遇到了一个与此问题类似的问题,但是在循环导航中,没有弹出后堆栈。从C-> A导航时,我错误地将navigate(int resId)的参数设置为 R.id.fragmentC

而不是使用

之类的操作

R.id.action_c_to_a