只要点击一个按钮,我就会在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)
有关为何发生这种情况的任何想法?什么是修复?
答案 0 :(得分:0)
为什么要使用removeView()
?
为什么不使用
mRelativeLayout.setVisibility(View.GONE);
特别是如果您要再次重新启动它?然后,这样您就不必继续在View
内重新创建OnClick
。
目前,通过不断创建和销毁View
并更新不太可能需要重新附加的参数,您正在快速进行比以往更加密集的操作!
做一次,重复使用。
答案 1 :(得分:0)
答案 2 :(得分:0)
嗯,这似乎有效:How to remove a View when animation ends?
我不确定是否有另一种方式,或者是否有人可以确认.post()的工作原理(在评论中提到但另一个确认会很好)。
我不会标记这个答案,以便如果有人有更好的解释或解决方案,他们可以提交答案。