58

アニメーション終了後にボタンの可視性を設定したい。

それがアニメーションと呼ばれるものです:

android.support.v4.app.FragmentTransaction fAnimation = this.getActivity().getSupportFragmentManager().beginTransaction();
fAnimation.setCustomAnimations(android.R.anim.slide_in_left, R.anim.pull_out_to_left);
if (this.isVisible()) {
    fAnimation.hide(this);
    fAnimation.commit();
}

// code that will be executed when the fragment is gone (after the animation is over)

フラグメントがなくなったことを知るためにリスナーをアタッチする方法はありますか?

4

5 に答える 5

67

@nmw が彼の回答で実装するアニメーターは、API レベル 11 で追加されたものであり、Android サポート ライブラリによって実装されているフラグメントでは機能しません。

Fragment アニメーション イベントをリッスンするために、サポート ライブラリのFragmentクラスを拡張してオーバーライドonCreateAnimationし、返された Animation オブジェクトにカスタム AnimationListener をアタッチしました。

public class MyFragment extends android.support.v4.app.Fragment {

    private static final String TAG = "MyFragment";

    @Override
    public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {

        Animation anim = AnimationUtils.loadAnimation(getActivity(), nextAnim);

        anim.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                Log.d(TAG, "Animation started.");
                // additional functionality 
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                Log.d(TAG, "Animation repeating.");
                // additional functionality
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                Log.d(TAG, "Animation ended.");
                // additional functionality
            }
        });

        return anim;
    }
}
于 2013-03-14T00:23:12.840 に答える
16

Fragmentをサブクラス化し、onCreateAnimatorをオーバーライドする必要があります。そうすれば、これらのアニメーションをXMLからロードして、リスナーをアタッチできます。

例えば

public class MyFragment extends Fragment
{
    @Override
    public Animator onCreateAnimator(int transit, boolean enter, int nextAnim)
    {
        final int animatorId = (enter) ? R.anim.in_anim : R.anim.out_anim;
        final Animator anim = AnimatorInflater.loadAnimator(getActivity(), animatorId);
        anim.addListener(new AnimatorListenerAdapter()
        {
            @Override
            public void onAnimationStart(Animator animation)
            {
                ...
            }

            @Override
            public void onAnimationEnd(Animator animation)
            {
               ...
            }
        });

        return anim;
   }    
于 2012-06-20T13:39:13.153 に答える
8

ここで上記の回答を組み合わせることは、私がサポート ライブラリ フラグメントで正常に使用しているサンプルです。

MenuFragment を拡張し、後で実行する内容のコールバックを取得するようにリスナーを設定するだけです。

public class MenuFragment extends Fragment {

private WeakReference<OnMenuClosedListener> onMenuClosedListener;

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
    Animation anim = null;
    if (enter) {
        anim = AnimationUtils.loadAnimation(getActivity(), R.anim.anim_slide_in_top);
    } else {
        anim = AnimationUtils.loadAnimation(getActivity(), R.anim.anim_menu_slide_out_top);
        anim.setAnimationListener(new AnimationListener() {
            @Override public void onAnimationStart(Animation animation) {
            }
            @Override public void onAnimationRepeat(Animation animation) {
            }
            @Override public void onAnimationEnd(Animation animation) {
                onMenuClosed();
            }
        });
    }

    // NOTE: the animation must be added to an animation set in order for the listener
    // to work on the exit animation
    AnimationSet animSet = new AnimationSet(true);
    animSet.addAnimation(anim);

    return animSet;
}

private void onMenuClosed() {
    if (this.onMenuClosedListener != null) {
        OnMenuClosedListener listener = this.onMenuClosedListener.get();
        if (listener != null) {
            listener.onMenuClosed();
        }
    }
}

public void setOnMenuClosedListener(OnMenuClosedListener listener) {
    this.onMenuClosedListener = new WeakReference<MenuFragment.OnMenuClosedListener>(listener);
}

/**
 * Callback for when the menu is closed.
 */
public static interface OnMenuClosedListener {

    public abstract void onMenuClosed();

}

}

于 2014-05-02T12:04:08.130 に答える
1

私はXamarinでこれをしなければなりませんでした。私の状況では、フラグメント アニメーションが終了したら、コールバックが必要でした。ちらつきなしで動作させる方法は次のとおりです(これはC#/ Xamarinです):

    public override Animation OnCreateAnimation(int transit, bool enter, int nextAnim)
    {
        Animation anim = base.OnCreateAnimation(transit, enter, nextAnim);

        if (anim == null && nextAnim != 0) {
            anim = AnimationUtils.LoadAnimation(Activity, nextAnim);
        }

        anim.SetAnimationListener(this);
        return anim;
    }

    public void OnAnimationEnd(Animation animation)
    {
    }

    public void OnAnimationRepeat(Animation animation)
    {
    }

    public void OnAnimationStart(Animation animation)
    {
    }

ノート:

  • 親フラグメントは実装する必要がありますAnimation.IAnimationListener
  • AnimationSetそうしないFragmentManagerと、リスナーがオーバーライドされ、コールバックが起動しません。
于 2015-11-24T21:30:35.237 に答える