我在当前的 Android 应用程序中使用了很多动画 - 我将 AnimationListener 连接到它们,从而控制流程。我还使用一些监听器来进行声音等,也用于流量控制。在其中一些动画/声音中途更改为另一个活动时,其中一些侦听器会导致崩溃,因为侦听器在活动本身结束/被释放后调用代码。是否有强制在某个视图(实际上是 ViewGroup)上的所有动画以删除活动?任何声音对象也是如此(使用 MediaPlayer)。至于 ViewGroup,这必须在所有包含的视图上递归完成。或者有另一种更简单的方法吗?
到目前为止,这是我的递归函数。我在去另一个活动之前调用它。我在 Activity 的顶级 ViewGroup 上调用它。可以是RelativeLayout、LinearLayout 或其他任何东西。LEVEL 仅用于测试,并不重要。
private void clearAnimationsInViewgroup(ViewGroup viewgroup, final int LEVEL) {
final int CHILDRENCOUNT = viewgroup.getChildCount();
Log.d(LOG_TAG, "LVL" + LEVEL + ", clearAnimationsInViewgroup: " + viewgroup + ", having child count: " + CHILDRENCOUNT);
View view;
Animation animation;
for (int i = 0; i < CHILDRENCOUNT; i++) {
view = viewgroup.getChildAt(i);
// "View" can be a subclass "ViewGroup"?
if (view instanceof ViewGroup) {
ViewGroup childViewgroup = (ViewGroup)view;
clearAnimationsInViewgroup(childViewgroup, LEVEL + 1);
}
animation = view.getAnimation();
if (animation != null) {
Log.d(LOG_TAG, "LVL" + LEVEL + " clearing anim listener");
animation.setAnimationListener(null);
}
}
}