Анимация в framgent не перезапускается после поворота - PullRequest
1 голос
/ 30 ноября 2011

У меня есть анимация, которая правильно запускается при первом отображении фрагмента.Однако после изменения ориентации он не будет перезапущен.Анимация - это ресурс списка анимаций, установленный в качестве фона 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();
}

РЕДАКТИРОВАТЬ: Я забыл добавить, что анимация находится внутри вкладки, что усложняет задачу,Однако я выяснил проблему и добавлю ответ ниже.

1 Ответ

3 голосов
/ 30 ноября 2011

Есть два случая, которые необходимо решить, в зависимости от того, когда была создана вкладка:

  1. ПЕРВЫЙ вкладка создана, и ВТОРОЕ ее действие прикрепляется к окну
  2. ПЕРВЫЙ Действие прикрепляется к окну, и ВТОРАЯ вкладка создается

Первый случай, если вкладка отображается первой или во время вращения. Второй случай возникает, когда пользователь переключается на эту вкладку, потому что она не первая. Рассмотрим каждый случай отдельно:

Случай 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 (), когда он становится видимым, и тогда запускается анимация.

...