我有一个动画,它在第一次显示片段时正确启动。但是在方向更改后,它将不会重新启动。动画是动画列表资源,设置为ImageView的背景。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View root = inflater.inflate(R.layout.fragment_lead_manual,
container, false);
final ImageView badgeEntryView = (ImageView) root
.findViewById(R.id.manual_image);
mAnimation = (AnimationDrawable) badgeEntryView.getBackground();
return root;
}
@Override
public void onResume() {
super.onResume();
mAnimation.start();
}
@Override
public void onPause() {
super.onPause();
mAnimation.stop();
}
编辑:我忘了添加动画在标签内,这让事情变得更加困难。但是,我已经找到了问题并将在下面添加答案。
答案 0 :(得分:3)
根据创建标签的时间,有两种情况需要解决:
如果选项卡是显示的第一个选项卡或在旋转期间,则会出现第一种情况。当用户切换到该选项卡时,会出现案例二,因为它不是第一个。让我们分别处理每个案例:
案例1:a)创建标签b)附加到窗口
在将AnimationDrawable.start()附加到窗口之前调用它(即在onCreate()或onResume()内部)会中断动画。如Android docs中所述:
重要的是要注意,在Activity的onCreate()方法中,无法调用在AnimationDrawable上调用的start()方法,因为AnimationDrawable尚未完全附加到窗口。如果你想立即播放动画而不需要交互,那么你可能想从你的Activity中的onWindowFocusChanged()方法调用它,当Android让你的窗口成为焦点时会调用它。
碎片更难,但基本相同。我们覆盖Activity中的方法,然后调用Fragment:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
final FragmentManager fm = getFragmentManager();
ManualLeadFragment manualFragment = (ManualLeadFragment) fm
.findFragmentByTag(TAG_MANUAL);
if (manualFragment != null) {
manualFragment.startAnimation();
}
}
}
然后在Fragment中,实现startAnimation():
void startAnimation() {
mAnimation.start();
}
案例2:a)附加到窗口b)创建标签
在这种情况下,已经发生了对onWindowFocusChanged()的调用,因此动画将无法启动。所以我们仍然需要在onResume()期间启动它,但略有不同:
@Override
public void onResume() {
super.onResume();
if (isVisible()) {
startAnimation();
}
}
这会调用与情况1相同的startAnimation()方法,但由于Fragment已经附加到Window,因此可以在onResume()期间调用它。
<强>摘要强>
只有在片段可见时才能调用AnimationDrawable.start()。有时它在onResume()期间可见,并且可以在该点开始动画。其他时候它当时还不可见,然后在它变得可见时调用onWindowFocusChanged()方法,然后启动动画。