重绘动画后的视图,尝试使用侦听器删除导致NPE

时间:2016-01-22 04:51:34

标签: android android-animation android-view

只要点击一个按钮,我就会在RelativeLayout中添加然后动画一个简单的ImageView。继承了我目前的代码:

 mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            ImageView imageview = new ImageView(getActivity());
            imageview.setImageDrawable(getActivity().getDrawable(R.drawable.pic));
            imageview.setLayoutParams(layoutParams);
            mRelativeLayout.addView(imageview);



            Animation anim = AnimationUtils.loadAnimation(getActivity(), R.anim.animation);
            anim.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {

                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    mRelativeLayout.removeView(imageview);
                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }
            });
            imageview.startAnimation(anim);
        }

这在大多数情况下都可以正常工作,但是如果我快速点击按钮,应用程序会崩溃并显示以下NPE:

  

java.lang.NullPointerException:尝试从空对象引用上的字段'int android.view.View.mViewFlags'读取                                                                     在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3398)                                                                     在android.view.View.draw(View.java:16187)                                                                     在android.view.View.updateDisplayListIfDirty(View.java:15180)                                                                     在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)                                                                     在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)                                                                     在android.view.View.updateDisplayListIfDirty(View.java:15140)                                                                     在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)                                                                     在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)                                                                     在android.view.View.updateDisplayListIfDirty(View.java:15140)                                                                     在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)                                                                     在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)

有关为何发生这种情况的任何想法?什么是修复?

3 个答案:

答案 0 :(得分:0)

为什么要使用removeView()

为什么不使用

mRelativeLayout.setVisibility(View.GONE);

特别是如果您要再次重新启动它?然后,这样您就不必继续在View内重新创建OnClick

目前,通过不断创建和销毁View并更新不太可能需要重新附加的参数,您正在快速进行比以往更加密集的操作!

做一次,重复使用。

答案 1 :(得分:0)

在调用onAnimationEnd之后,看起来动画还没有完成视图。 您可以尝试将可见性设置为已消失,并使用Handler延迟removeView调用。

答案 2 :(得分:0)

嗯,这似乎有效:How to remove a View when animation ends?

我不确定是否有另一种方式,或者是否有人可以确认.post()的工作原理(在评论中提到但另一个确认会很好)。

我不会标记这个答案,以便如果有人有更好的解释或解决方案,他们可以提交答案。