Как обновить Android RelativeLayout при изменении ориентации без перезапуска Activity?

У меня есть активность Android с RelativeLayout, и я применил следующий метод предотвращения воссоздания активности при изменении ориентации:

@Override
public void onConfigurationChanged(Configuration newConfig) {       
    super.onConfigurationChanged(newConfig);

}

Я, очевидно, ничего не делаю в этом методе, но он отлично работал при использовании LinearLayout. Теперь, однако, используя RelativeLayout, мой макет все испорчен при изменении ориентации на альбом.

Каков наиболее эффективный способ правильной перерисовки экрана без повторного запуска активности с вызовом onCreate?

Ответ 1

У вас есть два способа:

  • Сохранение объекта во время изменения конфигурации
  • Обработка конфигурации Изменение

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

IMHO лучшим способом является первый, реализуя метод: onRetainNonConfigurationInstance();

Здесь приведен полный пример использования.

Примечание: функция onCreate будет вызываться снова, но вы можете настроить свой код, чтобы предотвратить повторное выполнение задачи с большим запуском во время изменения конфигурации

Ответ 2

Существует третий и более простой способ, который отсутствует в ответе Франческо.

Просто добавьте

android:configChanges="keyboardHidden|orientation"

к тегу активности всех действий, которые вы не хотите перезапускать при изменении из режима альбомной ориентации в портрет. Это приведет к тому, что ОС перестроит ваш макет, не разрушив его перед перестройкой. Метод oncreate не будет вызван снова, и вы не потеряете состояние активности. Но будьте осторожны, это будет работать, только если вы используете один и тот же файл макета для портретного и ландшафтного режима.

Подробнее об этом question