Есть два случая, которые необходимо решить, в зависимости от того, когда была создана вкладка:
- ПЕРВЫЙ вкладка создана, и ВТОРОЕ ее действие прикрепляется к окну
- ПЕРВЫЙ Действие прикрепляется к окну, и ВТОРАЯ вкладка создается
Первый случай, если вкладка отображается первой или во время вращения. Второй случай возникает, когда пользователь переключается на эту вкладку, потому что она не первая. Рассмотрим каждый случай отдельно:
Случай 1: a) Создать вкладку b) Присоединить к окну
Вызов AnimationDrawable.start () до его прикрепления к окну (то есть внутри onCreate () или onResume ()) прерывает анимацию. Как указано в Android-документах :
Важно отметить, что метод start (), вызываемый для AnimationDrawable, не может быть вызван во время метода onCreate () вашего Activity, поскольку AnimationDrawable еще не полностью присоединен к окну. Если вы хотите немедленно воспроизвести анимацию, не требуя взаимодействия, то вы можете вызвать ее из метода onWindowFocusChanged () в вашей деятельности, который будет вызываться, когда Android фокусирует ваше окно.
С фрагментами сложнее, но в основном то же самое. Мы переопределяем метод в Activity и затем вызываем фрагмент:
@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();
}
}
}
А затем во Фрагменте реализовать startAnimation ():
void startAnimation() {
mAnimation.start();
}
Случай 2: a) Присоединить к окну b) Создать вкладку
В этом случае вызов onWindowFocusChanged () уже произошел, поэтому анимация не запускается. Поэтому нам все еще нужно запустить его во время onResume (), но немного по-другому:
@Override
public void onResume() {
super.onResume();
if (isVisible()) {
startAnimation();
}
}
Это вызывает тот же метод startAnimation (), что и в случае 1, но поскольку фрагмент уже присоединен к окну, его можно вызывать во время onResume ().
Резюме
AnimationDrawable.start () может быть вызван только тогда, когда фрагмент виден. Иногда это видно во время onResume (), и анимация может быть запущена в этот момент. В других случаях он еще не виден в то время, и затем вызывается переопределенный метод onWindowFocusChanged (), когда он становится видимым, и тогда запускается анимация.