NavHostのビューとしての<androidx.fragment.app.FragmentContainerView>対<fragment>


9

androidx.fragment.app.FragmentContainerView通常のfragmentアプリの代わりにnavHostとして使用すると、向きを変更した後、目的地に移動できません。

次のエラーが発生します。 java.lang.IllegalStateException: no current navigation node

適切に使用するために知っておくべき落とし穴はありますか、またはナビゲーションコンポーネントの使用方法が正しくありませんか?

ビューを持つ単純なアクティビティxml:


...
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:navGraph="@navigation/nav_simple" />
...

ナビゲーションコード:

<?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/nav_legislator.xml"
    app:startDestination="@id/initialFragment">

    <fragment
        android:id="@+id/initialFragment"
        android:name="com.example.fragmenttag.InitialFragment"
        android:label="Initial Fragment"
        tools:layout="@layout/initial_fragment">
        <action
            android:id="@+id/action_initialFragment_to_destinationFragment"
            app:destination="@id/destinationFragment" />
    </fragment>
    <fragment
        android:id="@+id/destinationFragment"
        android:name="com.example.fragmenttag.DestinationFragment"
        android:label="Destination Fragment"
        tools:layout="@layout/destination_fragment" />

</navigation>

これは、バグを簡単に再現できるgithubリポジトリです:https : //github.com/dmytroKarataiev/navHostBug


あなたは配置する必要があります<fragmentFragmentContainerView
EpicPandaForce

回答:


18

このno current navigation nodeエラーは、グラフが設定されていないときにを呼び出そうとすると発生しますnavigate()FragmentContainerView構成の変更を使用している場合にのみ発生する場合は、このバグに関連しています。このバグは修正され、Navigation 2.2.0-rc03でリリースされる予定です。

この問題を回避するには、切り替えて<fragment>削除するかapp:navGraph="@navigation/nav_simple"、代わりにを呼び出しますnavController.setGraph(R.navigation.nav_simple)


私は実際にこのアプローチを試しましたが、まったく同じエラーが発生しました。リポジトリをチェックアウトして、このアプローチで機能させることができますか?
Dmytro Karataiev

また、このクラッシュは方向を変更した後にのみ発生します。それは他のすべての時間で動作します。
Dmytro Karataiev

私は実際にはこれは同じエラーではないと思います、私の質問ではナビゲーションコントローラーがnullではありませんが、そのバックスタックは空であり、グラフはnullです。
Dmytro Karataiev

ええ、ええ、それはかなり重要な情報です。あなたが経験しているのはこの別の問題だと思います。その問題で何が起こっているかを議論するために私の答えを更新しました。
ianhanniballake

ありがとう、完璧。
Dmytro Karataiev

0

FragmentビューをFragmentContainerViewに置き換える理由はわかりません。これが、この回答を追加する理由です。

アクティビティでフラグメントをホストする一般的なパターンの1つは、FrameLayoutを使用することです。Androidコミュニティではこれを何年も行ってきましたが、今は変わるでしょう。androidxチームは、これを行うためにFragmentContainerViewと呼ばれるこの新しいビューを導入しました。

FrameLayoutをFragmentContainerViewに置き換えるだけで、すべてがそのまま機能します。フラグメントトランザクションの処理方法を変更する必要はありません。

ここで得られる利点は、フラグメントのzオーダーと呼ばれる処理の改善です。使用例は次のとおりですが、基本的には、たとえば、2つのフラグメント間のexitとenterの遷移が互いに重ならないことを意味します。代わりに、このFragmentContainerViewは最初に終了アニメーションを開始し、次に開始アニメーションを開始します。

あなたが尋ねているなら、これはタグを置き換えることができますか?答えはイエスです。FragmentContainerViewを定義するときにandroid:name = "your_class_name"を追加するだけで、内部でFragmentTransactionを使用してフラグメントを構築および表示できます。つまり、後でフラグメントトランザクションを使用して置き換えることができます。

ソース

Androidドキュメント


1
これが著者の質問に答えるとは思わない。
AlgoRyan

それはまだ良い追加情報です。
Rvb84
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.