131

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

左側の選択ペインには、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この時点でボタンを押しても何も起こりません。e1まだスタック上にあるので、2回クリックする必要があります。さらに、クリックした後、onCreateViewでnullポインタ例外が発生しました。

この問題を「解決」するために、A B C D E選択するたびに以下を追加しました。

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

これが正しい解決策なのか、それとも私が何か違うことをすべきなのか疑問に思っていますか?

4

7 に答える 7

258

意図した動作に応じて、これを実行する方法はいくつかありますが、このリンクはすべての最良の解決策を提供するはずであり、当然のことながら、DianneHackbornによるものです。

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)、
于 2011-05-12T21:48:43.087 に答える
62

すべてのスタックエントリをポップしたくない場合のもう1つのクリーンなソリューション...

getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
getSupportFragmentManager().beginTransaction().replace(R.id.home_activity_container, fragmentInstance).addToBackStack(null).commit();

これにより、最初にスタックがクリーンアップされてから新しいフラグメントがロードされるため、任意の時点でスタック内のフラグメントは1つだけになります。

于 2013-07-24T09:58:10.507 に答える
28

Joachimの回答のおかげで、最終的にすべてのバックスタックエントリをクリアするためにコードを使用します。

// In your FragmentActivity use getSupprotFragmentManager() to get the FragmentManager.

// Clear all back stack.
int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
for (int i = 0; i < backStackCount; i++) {

    // Get the back stack fragment id.
    int backStackId = getSupportFragmentManager().getBackStackEntryAt(i).getId();

    getSupportFragmentManager().popBackStack(backStackId, 
        FragmentManager.POP_BACK_STACK_INCLUSIVE);

} /* end of for */
于 2012-11-09T07:47:03.940 に答える
7

私はBackstackをクリーンアップするために多くのことを研究し、最終的にTransactionBackStackとその管理を確認しました。これが私にとって最も効果的な解決策です。

 // CLEAR BACK STACK.
    private void clearBackStack() {
        final FragmentManager fragmentManager = getSupportFragmentManager();
        while (fragmentManager.getBackStackEntryCount() != 0) {
            fragmentManager.popBackStackImmediate();
        }
    }

上記のメソッドは、バックスタック内のすべてのトランザクションをループし、一度に1つずつすぐに削除します。

注:上記のコードが機能しない場合があり、このコードが原因でANRに直面するため、これを試さないでください。

以下のメソッドを更新 すると、その「名前」のすべての断片がバックスタックから削除されます。

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.popBackStack("name",FragmentManager.POP_BACK_STACK_INCLUSIVE);
  • name null以外の場合、これは検索する前の戻る状態の名前です。見つかった場合、その状態までのすべての状態がポップされます。The
  • POP_BACK_STACK_INCLUSIVEフラグを使用して、名前付き状態自体をポップするかどうかを制御できます。nullの場合、最上位の状態のみがポップされます。
于 2015-06-19T06:46:06.940 に答える
3

whileループを使用するコードと同様のコードを使用していますが、すべてのループでエントリカウントを呼び出しています...したがって、多少遅いと思います

FragmentManager manager = getFragmentManager();
while (manager.getBackStackEntryCount() > 0){
        manager.popBackStackImmediate();
    }
于 2016-02-29T16:17:56.560 に答える
0

バックスタックからフラグメントをポップする方法LarsHでここに書かれているように、この方法を使用して、いくつかのフラグメントを上から特定のタグに(タグ付きフラグメントと一緒に)ポップできます。

fragmentManager?.popBackStack ("frag", FragmentManager.POP_BACK_STACK_INCLUSIVE);

「frag」をフラグメントのタグに置き換えます。まず、フラグメントをバックスタックに追加する必要があることを忘れないでください。

fragmentTransaction.addToBackStack("frag")

でフラグメントを追加する場合addToBackStack(null)、そのようにフラグメントをポップすることはありません。

于 2019-12-03T13:29:59.423 に答える
-4
    // pop back stack all the way
    final FragmentManager fm = getSherlockActivity().getSupportFragmentManager();
    int entryCount = fm.getBackStackEntryCount(); 
    while (entryCount-- > 0) {
        fm.popBackStack();
    }
于 2013-03-05T21:10:37.510 に答える