ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Ошибки в Android 8.0: ориентация и доступ к контактам

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для решения проблемы с java.lang.IllegalStateException, связанной с прозрачными активностями, им стоит назначить ориентацию "unspecified". Для этого необходимо обновить файл AndroidManifest.xml:

xml
Скопировать код
<activity android:name=".YourTransparentActivity"
          android:screenOrientation="unspecified">
    <!-- Дополнительные параметры -->
</activity>

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

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Изменение ориентации в Oreo

С релизом Android Oreo были внедрены новые ограничения, касающиеся активностей и их ориентации на экране. Так, активности, которые не являются полноэкранными и непрозрачными, теперь не могут устанавливать фиксированную ориентацию.

Настройка активностей для Oreo

Тем, кто нацеливается на поддержку Oreo, следует проверить настройки тем своих активностей на предмет полноэкранных режимов. Желательно избегать использования android:windowIsTranslucent=true в собственных темах. Для того чтобы сделать активность непрозрачной, укажите android:windowIsTranslucent=false и android:windowIsFloating=false.

AsyncTask и Oreo

Появление Oreo немного осложнило работу с AsyncTask — стоит изучить новые методы и лучшие практики для выполнения фоновых задач, введённые в обновлении.

Условное установление запрашиваемой ориентации

Если вы намерены поддерживать ранние версии Android, учтите особенности Oreo. В этом поможет следующий код:

Java
Скопировать код
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    // Этот фрагмент кода сохраняет ваши настройки ориентации для Oreo
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

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

Роль тем в установке ориентации

Помните, что при выборе темы в Oreo значение android:theme=@style/Transparent подходит для полноэкранных и прозрачных активностей. Если же вы планируете установить фиксированную ориентацию экрана, тогда активность должна быть непрозрачной.

Управление режимами ввода для окон

Режимы ввода могут быть искусными. Чтобы поддерживать порядок, назначьте android:windowSoftInputMode значение stateHidden|adjustResize.

Проверка базовой темы

Если ваша базовая тема отвечает требованиям по версиям, начиная хотя бы с Theme.AppCompat.Light.NoActionBar, каждый сможет ощутить уют и современность.

Полноэкранные активности и требования к ориентации

Поклонники прозрачности в полноэкранном дизайне могут быть уверены, что Oreo позволяет таким активностям иметь определенную ориентацию, при условии избегания IllegalStateException.

Визуализация

Давайте представим приложения Android в виде домов:

  • Полноэкранный: Это аккуратный дом с тонированными окнами.
  • Непрозрачный: Надежный дом с непрозрачной дверью.

Запрос на изменение ориентации — это как запрос дому повернуться:

  • До Oreo: Вызов принят, дом открыт!
  • После Oreo: Только дома с тонированными окнами и непрозрачными дверями могут выполнить такой запрос.

Нарушение правил происходит, когда дом со стеклянными или полупрозрачными элементами пытается запросить ориентацию:

💥 Бах! Только полноэкранные непрозрачные активности могут делать это.

Обход ограничений:

Приспособимся к новым правилам: Полноэкранность + непрозрачность = взрывов не будет (🔄✅)

Распространенные проблемы

При возникновении IllegalStateException

Если вы столкнулись с IllegalStateException, вероятно, ваша активность ожидала другую тему, или она не соответствует требованиям полноэкранного режима.

Управление поворотом устройства

Хотя может быть соблазнительно указать android:screenOrientation="portrait", более правильным решением будет программное обработка ориентации устройства.

Приспособление к режиму многозадачности

Если вам нужно работать в режиме многозадачности, учтите, что setRequestedOrientation может вести себя не так, как вы ожидаете. Держите активности гибкими и адаптируйтесь к естественному ритму работы.

Переход к потокам и асинхронным задачам

На курсе современной разработки подумайте о переходе от AsyncTask к использованию Executor, HandlerThread или Coroutines — это как замена старой кареты на современный автомобиль.

Полезные материалы

  1. Handle configuration changes | Android Developers — Подробное руководство по управлению изменениями в конфигурации Android-приложения.
  2. Activity | Android Developers — Класс Activity: все, что нужно знать разработчику.
  3. Google Issue Tracker — Площадка для обсуждения и отчетов о проблемах, связанных с Android-активностями.
  4. Handling Orientation Changes in Android | by Ankit Sinhal | AndroidPub | Medium — Детальный разбор управления изменениями ориентации и связанных с ними проблем.
  5. core/java/android/app/Activity.java – platform/frameworks/base – Git at Google — Исходный код класса Activity на низком уровне.
  6. Handling Configuration Changes | CodePath Android Cliffnotes — Наглядный учебник для начинающих разработчиков Android, богатый советами по работе с изменением ориентации устройства.