Я только что реализовал функцию изменения ориентации - например, когда макет меняется с книжной на альбомную (или наоборот). Как я могу определить, когда закончилось событие изменения ориентации.
OrientationEventListener
Не работа. Как я могу получать уведомления о событиях изменения ориентации макета?
Ответы:
Используйте метод Activity onConfigurationChanged . См. Следующий код:
Вам также необходимо отредактировать соответствующий в вашем файле манифеста, чтобы включить android: configChanges. Посмотрите на приведенный ниже код:
ПРИМЕЧАНИЕ. В Android 3.2 (уровень API 13) или выше «размер экрана» также изменяется при переключении устройства между книжной и альбомной ориентацией. Таким образом, если вы хотите предотвратить перезапуск среды выполнения из-за изменения ориентации при разработке для уровня API 13 или выше, вы должны объявить android: configChanges = "direction | screenSize" для уровня API 13 или выше .
Надеюсь, что это поможет вам... :)
источник
Загрузка макета в папку layout-land означает, что у вас есть два отдельных макета, которые вы должны создать методом
setContentView
inonConfigurationChanged
.Если у вас только один макет, нет необходимости делать setContentView в этом методе. просто
источник
onConfigurationChanged(Configuration newConfig)
метод (как в этом ответе), но вместо того, чтобы обрабатывать его самостоятельно, я установил логический флаг, а затем вызвалrecreate()
метод, чтобы Android воссоздал действие в обычном режиме.recreate()
метода заключается в том, что экран на короткое время мигает черным. По этой причине я использовал другой подход: (1) сохранить ширину экрана вonCreate(...)
, (2) сравнить сохраненную ширину экрана с текущей шириной экрана в любом методе жизненного цикла, когда действие завершается (например,onSaveInstanceState(...)
).Просто хотел показать вам способ сохранить весь ваш Bundle после onConfigurationChanged:
Создайте новый Bundle сразу после вашего урока:
Затем после "protected void onCreate" добавьте следующее:
Если вы добавите это, все ваши классы в MainActivity будут сохранены.
Но лучше всего добавить это в свой AndroidManifest:
источник
onConfigurationChanged()
делает так, чтобы ваш instanceState не разрушался при изменении ориентации, поэтому вам не нужно его сохранять. Вы можете сохранить его для других событий в жизненном цикле действия, но я не знаю.используйте этот метод
И не забудьте добавить это в свой Androidmainfest.xml
как это
источник
Переопределить метод действия onConfigurationChanged
источник
Я просто хочу предложить другую альтернативу, которая действительно заинтересует некоторых из вас, как объяснялось выше:
подразумевает, что мы явно объявляем макет для внедрения.
В случае, если мы хотим сохранить автоматическую инъекцию благодаря папкам layout-land и layout. Все, что вам нужно сделать, это добавить его в onCreate:
Здесь мы отображаем или нет панель действий в зависимости от ориентации телефона
источник
Создайте экземпляр
OrientationEventListener
класса и включите его.источник
Если принятый ответ не работает для вас, убедитесь, что вы не указали в файле манифеста:
Это мой случай.
источник
В случае, если это полезно для некоторых новых разработчиков, потому что это не указано выше. Чтобы быть очень точным:
При использовании onConfigurationChanged вам понадобятся две вещи :
onConfigurationChanged
Метод в вашей деятельности классаУкажите в манифесте, какие изменения конфигурации будут обрабатываться вашим
onConfigurationChanged
методом.Фрагмент манифеста в приведенных выше ответах, хотя, несомненно, правильный для конкретного приложения, которому принадлежит манифест, это НЕ то, что вам нужно добавить в свой манифест для запуска метода onConfigurationChanged в вашем классе активности. т.е. приведенная ниже запись в манифесте может быть неправильной для вашего приложения.
В приведенной выше записи манифеста есть различные действия Android, для
android:configChanges=""
которых может запускаться onCreate в жизненном цикле Activity.Это очень важно : те, которые НЕ указаны в манифесте
onConfigurationChanged
, запускают ваш onCreate, а те, которые указаны в манифесте, запускают ваш метод в вашем классе активности.Итак, вам нужно определить, какие изменения конфигурации вам нужно обработать самостоятельно. Для Android Encyclopedically Challenged, как я, я использовал всплывающие подсказки в Android Studio и добавил почти все возможные варианты конфигурации. Перечисление всего этого в основном говорит о том, что я буду обрабатывать все, и onCreate никогда не будет вызываться из-за настроек.
Очевидно, что я не хочу заниматься всем, поэтому я начал устранять указанные выше варианты по одному. Повторная сборка и тестирование моего приложения после каждого удаления.
Еще один важный момент : если есть только одна опция конфигурации, которая обрабатывается автоматически, которая запускает ваш onCreate (у вас нет его в списке в вашем манифесте выше), тогда это будет выглядеть как
onConfigurationChanged
не работает. Вы должны поместить все соответствующие в свой манифест.В итоге у меня было 3, которые изначально запускали onCreate, затем я протестировал на S10 +, и я все еще получал onCreate, поэтому мне пришлось снова выполнить упражнение по устранению, и мне также понадобился
|screenSize
. Так что протестируйте на нескольких платформах.Итак, мое предложение, хотя я уверен, что кто-то может в этом дырки:
Добавьте свой
onConfigurationChanged
метод в свой класс деятельности с помощью TOAST или LOG, чтобы вы могли видеть, когда он работает.Добавьте все возможные параметры конфигурации в свой манифест.
Убедитесь, что ваш
onConfigurationChanged
метод работает, протестировав свое приложение.Удаляйте все параметры конфигурации из файла манифеста по одному, тестируя приложение после каждого.
Протестируйте на как можно большем количестве устройств.
Не копируйте и не вставляйте мой фрагмент выше в свой файл манифеста. Обновления Android изменяют список, поэтому используйте всплывающие подсказки Android Studio, чтобы убедиться, что вы получили их все.
Надеюсь, это кому-то сэкономит время.
Мой
onConfigurationChanged
метод только для информации ниже.onConfigurationChanged
вызывается в жизненном цикле после того, как новая ориентация станет доступной, но до воссоздания пользовательского интерфейса. Следовательно, я сначалаif
проверяю правильность ориентации, а затем второй вложенный,if
чтобы посмотреть на видимость моего UI ImageView, также работает правильно.источник
для реализации Kotilin в простейшей форме - срабатывает только при изменении экрана с портретного <--> ландшафта, если необходимо устройство, обнаружение переворота (180 градусов), вам нужно будет перейти к значениям датчика силы тяжести
источник