Это наблюдалось в Android Emulator 29.1.13 и сохраняется после обновления до версии 29.2.0.
Приложение имеет два действия: запуск и второе, вызываемое при запуске.Оба действия объявлены в AndroidManifest как
android: configChanges = "клавиатура | клавиатура скрытая | ориентация | screenSize | screenLayout"
android:screenOrientation
опущена (пробная screenOrientaition="sensor"
, screenOrientation="unspecified"
и т. Д. -та же проблема), auto-rotate screen
включен в настройках эмулятора.
Существуют разные макеты для книжной и альбомной ориентации, указанные в res / layout (пробовал res/layout-port
- без изменений в поведении) и res/layout-land
,Чтобы справиться с изменением ориентации, оба действия переопределяют onConfigurationChanged
.
Что-нибудь еще, что может вызвать ваши мгновенные комментарии?Если нет, давайте продолжим:)
На телефонах и эмуляторах телефонов обе операции выбирают правильную компоновку при запуске или после изменения ориентации.При работе с эмуляторами ТВ оставайтесь с альбомной планировкой, что тоже правильно.
Что-то странное происходит с эмуляторами планшетов (Pixel C, Nexus 9, пробовал даже 7-дюймовый WSVGA с более старыми API). В альбомном режиме - начальная активностьвыбирает правильную (альбомную) ориентацию, но использует макет для портрета, даже если поле orientation
в конфигурации (getResources().getConfiguration()
) имеет значение 2 (Configuration.ORIENTATION_LANDSCAPE
). Это происходит либо при запуске приложения в режиме lansdcape, либо при переключении в альбомную ориентацию.Для чистого эксперимента я запустил приложение со всем закомментированным кодом активности, кроме setContentView
- та же проблема.
Удивительно, но второе действие всегда получает правильный макет.
Существуеточевидный обходной путь - использование разных имен макетов и выбор макета программным образом в зависимости от текущей ориентации, однако я бы хотел знать, если это происходит на реальных устройствах или что-то еще нужно настроить для планшетов.