Подтвердить что ты не робот

Android ICS Launcher 4.0.x не может поддерживать ориентацию экрана

У меня странный случай для Android ICS Launcher 4.0.x.

Предварительное условие:

  • Устройство ICS с правами root

  • Загрузите исходный код Android ICS Launcher 4.0.3/4 (чтобы изменить и запустить)

Процедура:

  • Перейдите на рынок (Play Store), скачайте "Go Task Manager"

  • Откройте вкладку "Виджеты" в Launcher, найдите "Mem Optimize" , перетащите на главный экран (рабочее пространство)

  • Загрузите и установите "Fruit Ninja"

  • Создайте ярлык "Фруктовый ниндзя" рядом с виджемом "Mem Optimize" на главном экране.

  • Выполните "Fruit Ninja" и сохраните свой телефон в LANDSCAPE (держите его в руке в этом положении, не изменяйте это)

  • На экране меню "Fruit Ninja" , срез "Exit", выберите "Да"

  • Теперь вернитесь на Начальный экран Launcher, нажмите на виджет "Mem Optimize"

Текущий результат:

  • После шага 7 экран некоторое время поворачивается в LANDSCAPE и возвращается в ПОРТРЕТ.

Expectation:

  • После шага 7 экран должен храниться в ПОРТРЕТЕ.

Мои попытки (изменить исходный код Launcher ICS):

  • Добавить в "Manifest.xml": android:screenOrientation="portrait" = > по-прежнему не может решить проблему.

  • Обработать изменение конфигурации, android:configChanges="orientation|screenSize" = > все еще не удается устранить проблему.

  • Использование: setRequestedScreenOrientation(PORTRAIT) = > все еще не может устранить проблему.

То, что я пробовал, работало на Android 2.x; однако, начиная с версии 4.0.3+, как-то он работает не так, как ожидалось. Кто-нибудь знает об этом?

4b9b3361

Ответ 1

Проблема не в Launcher. Проблема в том, что одна конфигурация (и включает в себя ориентацию) разделяется между всеми действиями на телефоне.

Итак, если у вас есть активность, которая устанавливает ориентацию на Landspace, например. Камера (это классический пример, где я работаю), это "сделает" все другие действия на ландшафте, потому что, как я уже сказал, информация уникальна в системе и распространена среди всех.

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

Чтобы проверить, что я говорю, сделайте следующее. Напишите действие с темой диалога, например @android:style/Theme.Holo.Dialog, поэтому он не будет охватывать весь экран, и вы все равно сможете увидеть активность, которая была ниже. Эта деятельность должна иметь фиксированную ориентацию. Скажите, что вы настроили его на пейзаж. Затем используйте am start в оболочке Android, чтобы иметь возможность запустить только что созданную деятельность поверх любой другой активности. Вы увидите, что независимо от ориентации предыдущей активности, как только вы запускаете тестовую активность, предыдущая активность будет иметь ту же ориентацию, что и ваша тестовая активность. Когда вы нажмете назад, предыдущая активность восстановит ориентацию. Но иногда это может занять некоторое время, поэтому вы видите такие вещи, как ваш текущий результат.

Ответ 2

У пусковой установки ICS есть несколько мест, где она будет устанавливать ориентацию на неуказанную. Просто выполните поиск Launcher.java для setRequestedOrientation, но конкретно это либо на сборках "eng", либо на планшетах. Он делает это в onCreate, но также после перетаскивания из appscustomize.

Из Launcher.java onCreate:

// On large interfaces, we want the screen to auto-rotate based on the current orientation
if (LauncherApplication.isScreenLarge() || Build.TYPE.contentEquals("eng")) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}