現在の Android アプリでは多くのアニメーションを使用しています。AnimationListener をそれらにフックして、フローを制御しています。また、サウンド用のリスナーなどもフロー制御用に使用しています。これらのアニメーション/サウンドの途中で別のアクティビティに変更すると、アクティビティ自体が終了/割り当て解除された後にリスナーがコードを呼び出すため、これらのリスナーの一部がクラッシュします。アクティビティを削除するために、特定のビュー (実際には ViewGroup) のすべてのアニメーションを強制する方法はありますか? 同じことが、(MediaPlayer を使用する) サウンド オブジェクトにも当てはまります。ViewGroup に関しては、含まれているすべてのビューに対して再帰的に行う必要があります。または、これを行う別の簡単な方法はありますか?
これまでの私の再帰関数は次のとおりです。別のアクティビティに行く前に呼び出します。アクティビティの最上位の 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);
}
}
}