web-dev-qa-db-ja.com

ナビゲーションコンポーネントのポップ動作が正常に機能しない

私が作成しているアプリの内部では、シングルアクティビティアーキテクチャを使用しており、Googleの新しいナビゲーションコンポーネントを使用してアプリ内を移動することにしました。
それは大きな期待を示していますが、私の質問がそれらの1つについてあるいくつかの欠点があります。

順番にナビゲートされる3つのフラグメントがあると仮定します。ただし、3番目のフラグメントで[戻る]ボタンがクリックされたときに最初のフラグメントに戻りたい場合を除きます。方法は次のとおりです。

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>

ここでの問題は、ナビゲーションを2回繰り返し実行したいときに、例外が発生して次のように通知されることです。

Java.lang.IllegalArgumentException:ナビゲーションの宛先com.hmomeni.navisample:id/action_firstFragment_to_secondFragmentはこのNavControllerに認識されていません

さらなる調査により、戻るボタンを押して最初のフラグメントに戻ると、navController.currentDestinationは依然としてThirdFragmentを参照していますが、これは間違っており、FirstFragmentである必要があります。

これに関するどんな助けでもありがたいです。

5
Hamed Momeni

これは質問の複製であると思います here -もしそうなら、これは alpha04 のバグです。 alpha05にアップグレードしてみてください。

0
Lyla

私はこの質問に似た問題を抱えていましたが、循環ナビゲーションで、バックスタックがポップされませんでした。 C-> Aから移動するときに、navigate(int resId)のパラメーターを誤ってR.id.fragmentCに設定しました

のようなアクションを使用する代わりに

R.id.action_c_to_a

2
Eric B.

解決策とは言いませんが、ある程度の回避策を見つけました。
この問題を回避するには、ThirdFragmentからそれ自体へのアクションを作成し、navigateが呼び出されたときにnavController.currentDestinationを確認します。

私は本当の解決策が欲しいという理由でこの答えを受け入れません。

0
Hamed Momeni