Jetpack Window Manager для складных устройств

Важно!

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

В решении Jetpack Window Manager (сейчас доступно в бета-версии) предоставляется стандартный API для работы со всеми складными устройствами. Он предусматривает два важных класса:

  • DisplayFeature — обнаруживает разрывы в непрерывной плоской поверхности экрана, например петли или складки. WindowManager вернет коллекцию функций отображения при обратном вызове изменения макета.
  • FoldingFeature — позволяет получать сведения о конкретной функции устройства. В Surface Duo есть только одна функция складывания, в некоторых устройствах их может быть больше. Класс FoldingFeature предоставляет сведения о состоянии этой части устройства в свойствах для bounds, occlusionType, orientation, state и isSeparating.

Аналогичное руководство есть в Codelab. Узнайте больше о разработке решений для складных устройств в документации по Android. Кроме того, на сайте GitHub доступны примеры от команды Android. В заметках о выпуске Jetpack фиксируются изменения в Window Manager по мере обновления.

Совет

Элементы управления и вспомогательные классы в библиотеке для двухэкранных устройств Surface Duo работают с Window Manager. Выполните инструкции, чтобы добавить нужные пакеты в свой проект приложения.

Чтобы использовать Window Manager непосредственно в коде, выполните приведенные ниже инструкции.

Добавление зависимостей

Чтобы добавить библиотеку Jetpack Window Manager, обновите файл build.gradle.

  1. Убедитесь, что проект компилируется с API уровня 31:

    compileSdk 31
    
  2. Чтобы обеспечить доступ к необходимым API, добавьте эти зависимости:

    dependencies {
        implementation "androidx.window:window:1.0.0-beta02"
        implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-alpha03'
    }
    

Примечание

Имя библиотеки включает слово "beta", так как API Window Manager сейчас предоставляются в предварительной версии и могут измениться до выпуска стабильной версии.

Использование диспетчера окон в коде Kotlin

  1. В классе MainActivity объявите переменную для диспетчера окон:

    class MainActivity : AppCompatActivity() {
       private lateinit var windowInfoRepo: WindowInfoRepository
    

    Убедитесь, что в верхней части файла добавлена инструкция import androidx.window.WindowInfoRepository.

  2. Инициализируйте диспетчер окон в методе onCreate:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        windowInfoRepo = windowInfoRepository()
    

    Убедитесь, что в верхней части файла добавлена инструкция import androidx.window.layout.WindowInfoRepository.Companion.windowInfoRepository.

  3. Кроме того, в методе onCreate необходимо установить связь. Для действия необходимо задать текстовое представление layout_change_text, чтобы этот метод мог обновить отображаемый текст:

        lifecycleScope.launch(Dispatchers.Main) {
            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
                windowInfoRepo.windowLayoutInfo
                    .collect { newLayoutInfo ->
                       layout_change_text.text = "No display features detected"
                        for (displayFeature : DisplayFeature in newLayoutInfo.displayFeatures) {
                            if (displayFeature is FoldingFeature && displayFeature.occlusionType == FoldingFeature.OcclusionType.NONE) {
                                layout_change_text.text = "App is spanned across a fold"
                            }
                            if (displayFeature is FoldingFeature && displayFeature.occlusionType == FoldingFeature.OcclusionType.FULL) {
                                layout_change_text.text = "App is spanned across a hinge"
                            }
                        }
                    }
            }
        }
    
    

    Убедитесь, что в верхней части файла добавлены следующие импортируемые компоненты:

    import androidx.lifecycle.Lifecycle
    import androidx.lifecycle.lifecycleScope
    import androidx.lifecycle.repeatOnLifecycle
    import androidx.window.layout.DisplayFeature
    import androidx.window.layout.FoldingFeature
    import kotlinx.coroutines.Dispatchers
    import kotlinx.coroutines.flow.collect
    import kotlinx.coroutines.launch
    

    Примечание

    Класс WindowLayoutInfo содержит коллекцию элементов DisplayFeature, один или несколько из которых могут быть экземплярами FoldingFeature. Экземпляры функции складывания имеют свойства для bounds, occlusionType, orientation, state и isSeparating, которые можно запрашивать, чтобы принимать решения по настройке макета нового состояния.

  4. При выполнении этого кода действие будет обновлено с учетом текущего положения устройства и функций отображения (если приложение развернуто на складке или петле). Добавьте дополнительный код для проверки дополнительных сведений в объекте FoldingFeature.

Примеры

Репозиторий surface-duo-jetpack-window-manager-samples на сайте GitHub содержит несколько примеров Kotlin, демонстрирующих разные интерфейсы с поддержкой двух экранов, созданных с использованием диспетчера окон Jetpack.

API Java

Сведения о том, как получить доступ к классу через , см. в записи блога, посвященной обновлению alpha10 диспетчера окон Jetpack и этом примере Java.

Ресурсы