19

バック スタックは、Android でネストされたフラグメントとのやり取りをサポートしていますか?

もしそうなら、私は何を間違っていますか?私の実装では、戻るボタンは、このトランザクションをバック スタックに追加したという事実を完全に無視しています。ネストされたフラグメントの問題ではなく、私が何か間違ったことをしているだけであることを願っています。

次のコードは私のフラグメントの 1 つの中にあり、ネストされたフラグメントが現在表示されているものと新しいフラグメントを交換するために使用されます。

     MyFragment fragment = new MyFragment();
     FragmentTransaction ft = getChildFragmentManager().beginTransaction();
     ft.setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_left, R.animator.slide_in_from_left, R.animator.slide_out_right);
     ft.addToBackStack(null);
     ft.replace(R.id.myFragmentHolder, fragment);
     ft.commit();
4

4 に答える 4

30

私は同じ問題を抱えています。フラグメントをネストし、ネストされたフラグメントごとにバックスタックを保持したいと考えています。

しかし...どうやらこのケースはv4サポートライブラリでは扱っていないようです。ライブラリの FragmentActivity コードで、次のことがわかります。

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}

mFragments はアクティビティの FragmentManager を表しますが、このマネージャーが pop を子マネージャーに「伝達」しているようには見えません。回避策は、 FragmentActivity から継承されたアクティビティで次のように、子マネージャーで popBackStackImmediate() を手動で呼び出すことです。

private Fragment myFragmentContainer;

    @Override
    public void onBackPressed() {
            if (!myFragmentContainer.getChildFragmentManager().popBackStackImmediate()) {
                finish(); //or call the popBackStack on the container if necessary
            }
    }

より良い方法とより自動化された方法があるかもしれませんが、私のニーズではそれで問題ありません。

于 2012-12-06T11:44:56.267 に答える
-3
@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        fm.popBackStack();
        return;
    }
    finish();
}
于 2014-07-15T16:15:14.423 に答える