14

状況は次のとおりです。

API 17 で導入された子フラグメントを使用しています。

ActivityA -> FragmentA
ActivityA -> FragmentB

FragmentA -> ChildFragmentA
FragmentA -> ChildFragmentB

だから私はオンActivityA->FragmentA->ChildFragmentAで、アニメーションを使用してバックスタックに追加し、バックスタックをポップする FragmentTransaction に移行しActivityA->FragmentA->ChildFragmentBます (ChildFragmentB に移動するときのアニメーションと、押し戻して ChildFragmentA に移動するときのアニメーションがあります)。

次に移動しますActivityA->FragmentB(FragmentA はもはや接続されていません)。が表示されているActivityA->FragmentA場所に戻ると、から来たときと同じようにアニメーション化されます。 ChildFragmentBChildFragmentBChildFragmentA

再開時にこのアニメーションを無効にしたいActivity->FragmentA。ただし、子フラグメント間を移行するときはそのままにしてください。このアニメーションは FragmentTransaction で設定されます。これを実現する方法はありますか?

4

2 に答える 2

4

親フラグメントにロジックを追加して、非表示または表示されていることを検出し、子のアニメーションを明示的に無効または有効にすることで、これを解決しました。

@Override
public void onPause() {
    super.onPause();
    // If this fragment is being closed/replaced then disable animations 
    // in child fragments. Otherwise we get very nasty visual effects 
    // with the parent and child animations running simultaneously
    ChildFragment f = (ChildFragment) getChildFragmentManager()
                                        .findFragmentByTag(FRAGMENT_CHILD);
    if (f != null) {
        f.disableAnimations();
    }
}

@Override
public void onResume() {
    super.onResume();
    // if this fragment is being opened then re-enable animations 
    // in child fragments
    ChildFragment f = (ChildFragment) getChildFragmentManager()
                                        .findFragmentByTag(FRAGMENT_CHILD);
    if (f != null) {
        f.enableAnimations();
    }
}

子フラグメントでは、これらのメソッドを実装してアニメーションを有効/無効にする必要があります。これを行うには、アニメーションを無効にする必要がある場合にonCreateAnimation()、静的アニメーション ( ) をオーバーライドして使用します。R.anim.hold

private boolean mDisableAnimations;

void disableAnimations() {
    mDisableAnimations = true;
}

void enableAnimations() {
    mDisableAnimations = false;
}

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
    if (mDisableAnimations) {
        return AnimationUtils.loadAnimation(getActivity(), R.anim.hold);
    }
    return super.onCreateAnimation(transit, enter, nextAnim);
}

静的アニメーションは次のように定義されres/anim/hold.xmlています。

<?xml version="1.0" encoding="utf-8"?>
<translate
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:fromXDelta="0"
  android:toXDelta="0"
  android:duration="2000" />
于 2014-05-12T08:27:40.397 に答える