1. ホーム
  2. android

ナビゲーショングラフの開始位置をプログラムで変更するには?

2023-09-10 23:04:19

質問

基本的に、以下のようなナビゲーショングラフがあります。

ナビゲーショングラフの始点を fragment 2 に戻るのを防ぐために)到達した直後に fragment 1 に戻るのを防ぐため)。

これは私のコードです。

navGraph = navController.getGraph();
navGraph.setStartDestination(R.id.fragment2);
navController.setGraph(navGraph);

しかし、明らかにうまくいかず、次のように戻ってしまいます。 fragment 1 に戻ってしまいます。

私のやり方が悪いのでしょうか? 他に解決策はありますか?

どのように解決するのですか?

アップデートを行います。

このようなナビグラフがある場合

<fragment
    android:id="@+id/firstFragment"
    android:name="com.appname.package.FirstFragment" >
    <action
        android:id="@+id/action_firstFragment_to_secondFragment"
        app:destination="@id/secondFragment" /> 
</fragment>

<fragment
    android:id="@+id/secondFragment"
    android:name="com.appname.package.SecondFragment"/>

そして、2番目のフラグメントに移動してグラフのルートにしたい場合は、次のように指定します。 NavOptions :

NavOptions navOptions = new NavOptions.Builder()
        .setPopUpTo(R.id.firstFragment, true)
        .build();

そして、それらをナビゲーションに使用します。

Navigation.findNavController(view).navigate(R.id.action_firstFragment_to_secondFragment, bundle, navOptions);

setPopUpTo(int destinationId, boolean inclusive) - ナビゲートする前に、指定された目的地にポップアップします。これは、この目的地が見つかるまで、バックスタックからマッチしないすべての目的地をポップアップします。

destinationId - 間にあるすべての目的地をクリアして、ポップアップする目的地です。

inclusive - バックスタックから指定されたデスティネーションもポップアップする場合はtrueを指定します。



ALTERNATIVE:

<fragment
    android:id="@+id/firstFragment"
    android:name="com.appname.package.FirstFragment" >
<action
    android:id="@+id/action_firstFragment_to_secondFragment"
    app:destination="@id/secondFragment"
    app:popUpTo="@+id/firstFragment"
    app:popUpToInclusive="true" /> 
</fragment>

<fragment
    android:id="@+id/secondFragment"
    android:name="com.appname.package.SecondFragment"/>

そして、あなたのコードに

findNavController(fragment).navigate(
    FirstFragmentDirections.actionFirstFragmentToSecondFragment())

古い答え

非推奨 : clearTask 属性でアクションと関連する API を NavOptions は非推奨となりました。

出典 https://developer.android.com/jetpack/docs/release-notes



もし、ルートフラグメントを fragment 2 に変更したい場合 (例. fragment 2 を押すとアプリが終了します)、次の属性を action または destination :

app:clearTask="true"

実質的には次のようになります。

<fragment
    android:id="@+id/firstFragment"
    android:name="com.appname.package.FirstFragment"
    android:label="fragment_first" >
    <action
        android:id="@+id/action_firstFragment_to_secondFragment"
        app:destination="@id/secondFragment"
        app:clearTask="true" /> 
</fragment>

<fragment
    android:id="@+id/secondFragment"
    android:name="com.appname.package.SecondFragment"
    android:label="fragment_second"/>

を追加しました。 app:clearTask="true" をアクションに追加しました。



これで、ナビゲーションを行う際に fragment 1 から fragment 2 は次のコードを使ってください。

Navigation.findNavController(view)
        .navigate(R.id.action_firstFragment_to_secondFragment);