web-dev-qa-db-ja.com

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

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

9

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

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

18
ianhanniballake