1. ホーム
  2. android

[解決済み] 深くネストされたスタックから離れるとき、Fragmentのバックスタックをクリーンアップする方法はこれで良いのでしょうか?

2022-07-05 04:24:56

質問

Android Compatibility libraryを使用してフラグメントを実装していますが、レイアウトサンプルを拡張して、フラグメントにボタンが含まれ、それが別のフラグメントを起動するようにしました。

左側の選択領域には、5つの選択可能な項目があります。 A B C D E .

それぞれがフラグメントをロードし ( FragmentTransaction:replace を経由して) 詳細ペインに読み込まれます。 a b c d e

ここで、フラグメントを拡張して e を拡張して、別のフラグメントを読み込むボタンを含むようにしました。 e1 を読み込むボタンを含みます。私はこれをフラグメント e のonClickメソッドを以下のように変更しています。

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();

以下のように選択すると

E - e - e1 - D - E

次に、フラグメント e が詳細ペインに表示されます。これは問題なく、私が望むものです。しかし、もし私が back ボタンを押しても何も起こりません。2回クリックする必要があるのは e1 がまだスタック上にあるからです。さらに、クリックしまくった後、onCreateViewでヌルポインタ例外が発生しました。

この問題を「解決」するために、私は次のようなものを常に追加しました。 A B C D E が選択されるたびに

FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
    fm.popBackStack();
}

これが正しい解決策なのか、それとも何か違うことをする必要があるのか、ちょっと考えてみてください。

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

意図する動作に応じていくつかの方法がありますが、このリンクからすべての最適な解決策を得ることができます。

http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42

基本的に、以下のオプションがあります。

  • 最初のバックスタック状態に名前を付けて FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE) .
  • 使用方法 FragmentManager.getBackStackEntryCount() / getBackStackEntryAt().getId() で、バックスタックの最初のエントリのIDを取得し FragmentManager.popBackStack(int id, FragmentManager.POP_BACK_STACK_INCLUSIVE) .
  • FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) はバックスタック全体をポップするはずなのですが...。 というドキュメントがありますが は間違っていると思います。 (実際、私はそれが で渡す場合 POP_BACK_STACK_INCLUSIVE ),