【问题标题】:How to capture the flip event for ViewFlipper如何捕获 ViewFlipper 的翻转事件
【发布时间】:2016-08-20 14:28:35
【问题描述】:

我有一个自动翻转的 ViewFlipper 组件,我想处理该组件在当前视图和下一个视图之间进行转换的事件。有可能吗?

谢谢。

mViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
mViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
mViewFlipper.getAnimation().setAnimationListener(this);
mViewFlipper.startFlipping();

这是日志:

02-16 14:27:50.860: E/AndroidRuntime(7961): 致命异常: main 02-16 14:27:50.860: E/AndroidRuntime(7961): Process: com.idiadasample, PID: 7961 02- 16 14:27:50.860: E/AndroidRuntime(7961): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.idiadasample/com.idiada.activity.ViewFlipperActivity}: java.lang.NullPointerException: 尝试调用虚拟方法'void android.view.animation.Animation.setAnimationListener(android.view.animation.Animation$AnimationListener)' 在空对象引用 02-16 14:27:50.860: E/AndroidRuntime(7961): at android.app.ActivityThread .performLaunchActivity(ActivityThread.java:2298) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 02-16 14:27:50.860: E /AndroidRuntime(7961): 在 android.app.ActivityThread.access$800(ActivityThread.java:144) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.app.ActivityThread$H.handleMessage(ActivityThread .java:1278) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.os.Handler.dispatchMessage(Handler.java:102) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.os.Looper .loop(Looper.java:135) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.app.ActivityThread.main(ActivityThread.java:5221) 02-16 14:27:50.860: E /AndroidRuntime(7961): at java.lang.reflect.Method.invoke(Native Method) 02-16 14:27:50.860: E/AndroidRuntime(7961): at java.lang.reflect.Method.invoke(Method.java :372) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 02-16 14:27:50.860: E /AndroidRuntime(7961): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 02-16 14:27:50.860: E/AndroidRuntime(7961): 引起: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void android.view.animation.Animation.setAnimationListener(android.view.animation.Animation$AnimationListener)' 02-16 14:27:50.860: E/Android运行时(7961):在 com.idiada.activity.ViewFlipperActivity.onCreate(ViewFlipperActivity.java:89)02-16 14:27:50.860:E/AndroidRuntime(7961):在 android.app.Activity.performCreate(Activity.java :5933) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 02-16 14:27:50.860: E/AndroidRuntime(7961):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 02-16 14:27:50.860: E/AndroidRuntime(7961): ... 10 更多

【问题讨论】:

    标签: android listener viewflipper


    【解决方案1】:

    您可以按照this answer 中的建议添加动画并收听动画事件:

    viewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() {
       public void onAnimationStart(Animation animation) {}
       public void onAnimationRepeat(Animation animation) {}
       public void onAnimationEnd(Animation animation) {}
    });
    

    设置动画:

    viewFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
             R.anim.fade_in));
    viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
             R.anim.fade_out));
    

    【讨论】:

    • 您好,感谢您的回复。如果我这样做,我有 NullPointerException 因为 getAnimation() 返回 null,我应该如何初始化它?
    • 它仍然返回 null O_o
    • 您是否在添加侦听器之前设置动画? @rlopezo
    • 是 :$ 使用您的代码,我正在设置属性 InAnimation 和 OutAnimation,但没有设置动画。
    • 我需要查看更多代码和错误堆栈跟踪@rlopezo。请将您的代码和 LogCat 添加到您的问题中。
    【解决方案2】:

    我已扩展 ViewFlipper 来做到这一点。

    import android.content.Context;
    import android.support.annotation.NonNull;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.ViewFlipper;
    
    public class DecentViewFlipper extends ViewFlipper implements View.OnLayoutChangeListener {
    
        public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
            onViewFlipperFlippedListener.onViewFlipperFlipped(view, getDisplayedChild());
        }
    
        public interface OnViewFlipperFlippedListener {
            void onViewFlipperFlipped(View childView, int index);
        }
    
        public DecentViewFlipper(Context context) {
            super(context);
        }
    
        public DecentViewFlipper(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        private static final String TAG = DecentViewFlipper.class.getSimpleName();
        private OnViewFlipperFlippedListener onViewFlipperFlippedListener = null;
    
        public void setOnViewFlipperFlippedListener(@NonNull OnViewFlipperFlippedListener listener){
            if (listener == null) throw new IllegalStateException("OnViewFlipperFlippedListener can not be null");
            if (getChildCount() != 0) {
                DecentViewFlipper flipper = (DecentViewFlipper) getCurrentView().getParent();
                flipper.addOnLayoutChangeListener(this);
            } else {
                throw new IllegalStateException("can't use setOnViewFlipperFlippedListener before you have added at least one View to the "+TAG);
            }
            onViewFlipperFlippedListener = listener;
        }
    
        public OnViewFlipperFlippedListener getOnViewFlipperFlippedListener() {
            return onViewFlipperFlippedListener;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 2018-06-27
      • 1970-01-01
      相关资源
      最近更新 更多