web-dev-qa-db-ja.com

ナビゲーションアーキテクチャコンポーネントのバックスタックへのフラグメントの追加を無効にする

A、B、C、Xの4つのフラグメントがあるとします。このようにして、フラグメント間を移動できます。

_... -> A -> C -> X    and ... -> B -> C -> X
_

しかし、フラグメントXにいる場合はmNavController.navigateUp()を呼び出して、フラグメントCをスキップしてフラグメントAまたはBに移動します。何をする必要がありますか?

UPD:ナビゲーションアーキテクチャコンポーネントのみのソリューションが必要 https://developer.Android.com/topic/libraries/architecture/navigation/ ありがとうございます!

8
igor_rb

与えられたR.id.fragmentCはC宛先の名前です。X宛先から、次のことができます。

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentC, true);

これにより、Cの前まですべての宛先がスタックからポップされ、AまたはBがスタックの一番上に残ります。

15
bentesha

または、app:popUpToおよびapp:popUpToInclusiveナビゲーションの属性xmlリソースは、特定のトランザクションを実行するときにバックスタックを自動的にクリーンアップします。そのため、[戻る/上へ]ボタンをクリックすると、ユーザーがルートフラグメントに移動します。

<fragment
    Android:id="@+id/fragment1"
    Android:name="com.package.Fragment1"
    Android:label="Fragment 1">

    <action
        Android:id="@+id/action_fragment1_to_fragment2"
        app:destination="@id/fragment2"
        app:popUpTo="@id/fragment1"
        app:popUpToInclusive="true / false" />

</fragment>
9
Viacheslav

@benteshaで言及されているように、これは、フラグメントCが含まれるまでフラグメントをポップするように機能します。

以下のようにしてこれを達成することもできます:

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentA, false);

OR

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentB, false);

そして、これはfragmentA/fragmentBのみにポップアップします。これはあなた自身と他の人が理解するための最も説明的な方法だと思います。

3