Обработка состояний изменения ориентации

Как я могу обрабатывать все состояния события ориентации?

Что-то типа:

  • перед запуском (сохранить некоторые состояния экрана)
  • когда происходит (анимационные цели)
  • после того, как это произошло (загрузить состояние экрана)

Я знаю, что onConfigurationChanged может обрабатывать изменения ориентации. И я попробовал это:

    public void onConfigurationChanged(Configuration cfg) {
        saveState();

        super.onConfigurationChanged(cfg);

        loadState();
    }

В saveState я сохраняю lastIndex, просматриваемый в галерее, в SharedPreferences. В loadState я получаю lastIndex из SharedPreferences и делаю его текущим в галерее.

Я попытался также поместить loadState в метод onResume, но он не вызывается после изменения ориентации.


person Marcos Vasconcelos    schedule 20.10.2011    source источник


Ответы (2)


перед запуском (сохранить некоторые состояния экрана)

Используйте onSaveInstanceState() и/или onRetainNonConfigurationInstance() и/или фрагмент, на котором вы вызвали setRetainInstance(true)

когда происходит (анимационные цели)

Этим занимается ОС.

после того, как это произошло (загрузить состояние экрана)

Используйте onRestoreInstanceState() и/или getLastNonConfigurationInstance() (если вы пошли по маршруту фрагмента, ваши данные, естественно, все еще там)

Я знаю, что onConfigurationChanged может обрабатывать изменения ориентации.

ответ @EightEight прекрасно описывает это.

person CommonsWare    schedule 21.10.2011

Вы можете быть немного сбиты с толку.

Это из документов API< /а>:

public void onConfigurationChanged (Configuration newConfig) Вызывается системой при изменении конфигурации устройства во время выполнения вашей активности. Обратите внимание, что это будет вызываться только в том случае, если вы выбрали конфигурации, которые хотите обрабатывать с помощью атрибута configChanges в своем манифесте.

Если вы указали параметр в своем AndroidManifest, система уведомит вас об изменении ориентации, вызвав onConfigurationChanged(). Если вы не установили флаг, Android убьет вашу активность, запустит новую с правильной ориентацией, а затем вызовет onResume().

Если вы хотите получать уведомления, когда активность закончилась, ориентация изменилась и все выложено, я бы рекомендовал переопределить метод onDraw() в одном из ваших дочерних представлений. К тому времени все будет сделано, и вы можете, например, восстановить состояние до изменения ориентации.

ХТН.

person EightyEight    schedule 20.10.2011