ошибка изменения ориентации деятельности

У меня странная ошибка, которую я раньше не видел в приложении для Android. При переходе от действия, заблокированного в портретном режиме, к действию, заблокированному в альбомном режиме и обратно, действие, которое должно быть в портретном режиме, отображается в портретном режиме, переходит в альбомный, а затем обратно в портретный.

Это происходит, когда устройство лежит на столе без каких-либо изменений ориентации. Я использую два отдельных действия, и это единственный код, который у меня есть в проекте.

Здесь видео об ошибке и вот ссылка на конкретный проект, в котором воспроизводится эта ошибка. Это происходит на нескольких устройствах, поэтому оно не изолировано от моего устройства.

Вопросы:

  • Вы знаете, что могло быть причиной этого?
  • Есть ли что-нибудь, что вы можете порекомендовать для исправления этого?

Что я пробовал:

  • Программная установка ориентации
  • Погуглил и ничего не нашел

Обновление 1

Еще кое-что, что я пробовал:

  • Установка портретной активности на «носенсор» и альбомной на «альбомную»
  • Установка портретной активности на «Носенсор» и программная установка альбомной активности в onCreate

Обновление 2

Я работал с проектом, указанным выше, и просто сделал несколько переопределений, чтобы выйти из всего, что происходит. Я обнаружил, что когда вызывается onConfigurationChanged, он немного перекликается между альбомной и портретной ориентациями. Вывод для обратной навигации, которая не выполняет шимми, выглядит следующим образом:

D/class com.mdk_studio.orientationbugtests.MainActivity: onStateNotSaved
D/class com.mdk_studio.orientationbugtests.MainActivity: onRestart
D/class com.mdk_studio.orientationbugtests.MainActivity: onWindowFocusChanged

Вывод ошибки shimmy:

D/class com.mdk_studio.orientationbugtests.MainActivity: onStateNotSaved
D/class com.mdk_studio.orientationbugtests.MainActivity: onRestart
D/class com.mdk_studio.orientationbugtests.MainActivity: onWindowFocusChanged
D/class com.mdk_studio.orientationbugtests.MainActivity: onConfigurationChanged
D/class com.mdk_studio.orientationbugtests.MainActivity: onConfigurationChanged

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


person Filled Stacks    schedule 10.09.2018    source источник
comment
Я бы посоветовал вообще не блокировать ориентацию.   -  person egoldx    schedule 10.09.2018
comment
Попробуйте следующее: android: screenOrientation = альтернатива носенсору для android: screenOrientation = портрет   -  person Viraj Mohite    schedule 10.09.2018
comment
@egoldx, так что никакой блокировки и просто программная установка ориентации? И как сделать так, чтобы активность не перешла в портретную ориентацию в альбомной и в альбомную в портретную?   -  person Filled Stacks    schedule 10.09.2018
comment
@VirajMohite Я изменил android: screenOrientation на носенсор для обоих действий, а затем установил LandscapeActivity на ландшафт с помощью setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) ;. Он по-прежнему делает то же самое.   -  person Filled Stacks    schedule 10.09.2018
comment
Нет, не используйте для обоих действий, используйте только для действий, которые вы хотите сохранить в портретном режиме.   -  person Viraj Mohite    schedule 10.09.2018
comment
@VirajMohite Добавил носенсор в MainActivity и ландшафт в мою LandscapeActivity, и это все еще происходит. Первые три навигации этого не происходило, после этого происходит каждый раз. Вы можете скачать проект, запустить его и посмотреть, сработают ли ваши идеи.   -  person Filled Stacks    schedule 10.09.2018
comment
Странно, я только что пробовал на 2-х разных устройствах, и проблем нет ... Можете ли вы протестировать на каком-нибудь другом устройстве?   -  person makvasic    schedule 12.09.2018
comment
@makvasic да пробовал на s8, nokia 3, nokia 2, Nexus 5x. Они все это делают. На некоторых устройствах это происходит только после 6-10 попыток. Когда это происходит однажды, то это происходит каждый раз после этого. Но я только что понял, как заставить его работать. Отправляю ответ сейчас.   -  person Filled Stacks    schedule 12.09.2018


Ответы (1)


После тестирования всех различных комбинаций настройки ориентации уровня манифеста и настройки программной ориентации. Я понял, что для того, чтобы ориентация в функции onConfigurationChanged не была неправильной, вы должны установить ориентацию до фактического запуска навигации.

Комбинация, которая сработала для меня и полностью устранила поведение, заключалась в том, чтобы установить действие в манифесте, которое я хочу в портретной ориентации, на "носенсор". Затем установите действие, которое я хочу в альбомной ориентации, в альбомное, используя

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

и верните книжную ориентацию в onBackPressed до перехода. Эта часть важна, после того, как навигация была запущена, а затем вы установили ориентацию, в некоторых случаях, когда newConfiguration проходит в вызове onConfigurationChanged, он имеет неправильную ориентацию, а затем каким-то образом выдает ему другой вызов, чтобы исправить это после того, как он обновился с первого звонка.

tl; dr Установите ориентацию для занятия, которое вы хотите в портретной ориентации, на «носенсор». Программно установите альбомную ориентацию в onCreate. Верните портретную ориентацию в onBackPressed, перед супервызовом.

person Filled Stacks    schedule 12.09.2018