Активность не перезапускается при изменении ориентации, когда размер окна равен 2/3 в многооконном режиме.

У меня проблемы с изменением ориентации в многооконном режиме. Действие не перезапускается при изменении ориентации, когда размер окна составляет 2/3 (в многооконном режиме) на планшетном устройстве. Мой макет выглядит неправильным из-за этого.

Активность перезапускается надлежащим образом при изменении ориентации, когда размер окна составляет 1/2 или 1/3 размера экрана в многооконном режиме. Я попробовал и подтвердил это на устройствах Nexus 7 и Pixel C в эмуляторе (Android Studio) с изображениями Oreo и Pie.

Мое приложение предназначено для Oreo 8.1, и я не использую «android: configChanges» или «android: screenOrientation» в манифесте.

Обратите внимание, что размер окна 2/3 не является квадратным, и размер экрана немного меняется в обеих ориентациях, и если изменение ориентации не срабатывает, то изменение размера экрана должно вызывать перезапуск активности.

Действия по воспроизведению:

  1. Запустите приложение в режиме отладки на планшете.
  2. Поместите точки останова внутри onCreate и onResume.
  3. Переведите его в многооконный режим (размер по умолчанию 1/2).
  4. Поверните устройство и проверьте, срабатывают ли точки останова (будут).
  5. Измените размер окна на 2/3.
  6. Поверните устройство и проверьте, срабатывают ли точки останова (нет!).

Я пропустил что-то, что вызывает эту проблему? или это баг или что-то другое? Как я могу перезапустить свою деятельность в этом случае?


person Nirav Patel    schedule 20.08.2018    source источник
comment
я замечаю, что на R активность не только не воссоздается, но даже не проходит через onStart/onStop. также на моем устройстве есть только ½ экрана с разделенным экраном   -  person squirrel    schedule 13.03.2021


Ответы (1)


Интересный вопрос, я никогда не знал, что есть исключения в процессе смены ориентации. Мне удалось воспроизвести проблему с эмулятором Pixel C (Android 8.1) и приложением, ориентированным на уровень API 26.

Я предполагаю, что ваш экран - это не просто еще один список, потому что в этом случае разница в 12 пикселей (1688 против 1676, если я могу доверять) rel="nofollow noreferrer">LayoutInspector) не имеет значения, поэтому я хотел добавить наблюдение, которое может оказаться полезным:

Мое приложение содержит пользовательский View, и из журналов я вижу, что его методы onMeasure() и onLayout() вызываются, даже если ActivitysonCreate() не вызывается. Так что здесь вы можете вмешаться и провести тонкую настройку.

Другой вариант — принудительно воссоздать Activity. Вы можете сделать это, вызвав метод Activity recreate() (задокументировано здесь), как только вы обнаружите, что размеры экрана изменились. Чтобы отслеживать изменения размера экрана, вы можете создать собственный ViewGroup, переопределяющий onLayout(), и использовать его в качестве корня файла макета вашего Activity.

person Bö macht Blau    schedule 20.08.2018
comment
Спасибо, с помощью предоставленной вами информации я смог воссоздать (перезапустить) действие, когда оно не выполнялось автоматически (размер окна 2/3). - person Nirav Patel; 21.08.2018