14

私は Android フラグメントに非常に問題があります... バックスタックが次のようになっているとします。

[C]
[B]
[A]
---

戻るボタンを押すと飛び出し、スタックの一番上にFragment C残ります。では、バックスタックを維持しながらFragment Bスワップするにはどうすればよいでしょうか。作業中は見えませんのでご注意ください。Fragment CFragment DFragment B

[C] <- [D]               [D]
[B]            ----->    [B]
[A]                      [A]
---                      ---

このように、戻るボタンを押すとFragment D飛び出し、上に残りFragment Bます。Fragment Cスタックから完全に削除されます。

このように各フラグメントをスタックに追加します

FragmentTransaction ft = manager.beginTransaction();
ft.replace(id, instance, getTag(instance));
ft.addToBackStack(getTag(instance));
ft.commit();

なしで同じ呼び出しを行うことでこれを達成できると思いましたがaddToBackStack、作成Fragment DしてFragment B重複しました。

4

3 に答える 3

4

フラグメント D を追加する前に、バックスタックをポップしようとしましたか?

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.popBackStack(); // or popBackStackImmediate();
ft.addToBackStack(<fragmentD>);
于 2013-07-06T03:10:02.590 に答える
0

fragmentTransaction.replaceFragmentManager 内のすべてのフラグメントを置き換えてから、新しいフラグメントを追加することになっています。グーグルによると :

これは、同じ containerViewId で追加された現在追加されているすべてのフラグメントに対して remove(Fragment) を呼び出してから、ここで指定された同じ引数で add(int, Fragment, String) を呼び出すことと基本的に同じです。

しかし、ご覧のとおり、常にうまく機能しているわけではありません。

(それに関するその他の有用な質問: FragmentTransaction replace not working )

次のコードを使用します(の助けを借りてfragmentManager.getFragments()):

int top = getSupportFragmentManager().getFragments().size()-1;
while (top > 0 && getSupportFragmentManager().getFragments().get(top) == null) {
    top--;
}
getSupportFragmentManager().beginTransaction()
                 .remove(getSupportFragmentManager().getFragments().get(top))
                 .add(R.id.fragment_container, newfrag).commit();

(バックスタックを使用していないことは知っていますが、少し混乱しています。)

于 2015-07-31T08:32:00.127 に答える