Поддержка съемных клавиатур помогает повысить продуктивность пользователей на устройствах с большим экраном. Android запускает изменение конфигурации каждый раз, когда клавиатура подключается к устройству или отключается от него, что может привести к потере состояния пользовательского интерфейса. Приложение может сохранять и восстанавливать свое состояние, позволяя системе обрабатывать повторное создание действий, или ограничивать повторное создание действий для изменений конфигурации клавиатуры.
Во всех случаях данные, связанные с клавиатурой, хранятся в объекте Configuration. Поля keyboard и keyboardHidden объекта конфигурации содержат информацию о типе клавиатуры и ее доступности.
Рекомендации
Приложения, оптимизированные для больших экранов, поддерживают все типы устройств ввода, от программных и аппаратных клавиатур до стилуса, мыши, сенсорной панели и других периферийных устройств.
Чтобы обеспечить поддержку внешних клавиатур, необходимо изменить конфигурацию. Это можно сделать двумя способами:
- Позвольте системе воссоздать запущенное действие, а сами позаботьтесь об управлении состоянием приложения.
- Управлять изменением конфигурации самостоятельно (действие не будет создано заново):
- Объявите все значения конфигурации, связанные с клавиатурой
- Создайте обработчик изменений конфигурации
Приложения для эффективной работы, в которых часто требуется точное управление пользовательским интерфейсом для ввода текста и других данных, могут выиграть от подхода «сделай сам» к обработке изменений конфигурации.
В особых случаях вы можете изменить макет приложения, когда аппаратная клавиатура подключена или отключена, например, чтобы освободить больше места для инструментов или окон редактирования.
В Jetpack Compose реагировать на изменения конфигурации клавиатуры можно двумя способами:
- Реактивный пользовательский интерфейс. Считывайте текущее состояние конфигурации непосредственно в composable-функциях с помощью
LocalConfiguration.current. Пользовательский интерфейс автоматически перекомпонуется, чтобы адаптироваться к новому состоянию при подключении или отключении клавиатуры. - Обратный вызов побочного эффекта. Используйте
DisposableEffectс учетом жизненного цикла, чтобы зарегистрировать прослушиватель изменения конфигурации в объекте Activity хоста. Это позволит запускать события, не связанные с интерфейсом (например, ведение журнала или аналитику), без повторного создания объекта Activity или создания экземпляров фиктивных элементов представления.
Ингредиенты
android:configChanges– атрибут элемента<activity>в манифесте приложения. Сообщает системе об изменениях конфигурации, которыми управляет приложение.LocalConfiguration– поставщик локальных composable-функций, который предоставляет текущее устройствоConfiguration.DisposableEffect– API побочных эффектов Compose, который запускает блок кода, когда компонент Composable входит в композицию, и очищает его, когда компонент выходит из нее.
Шаги
Объявите атрибут configChanges и добавьте значения, связанные с клавиатурой, чтобы предотвратить повторное создание действия. Затем используйте LocalConfiguration.current, чтобы динамически адаптировать макет Composable, или зарегистрируйте прослушиватель конфигурации с помощью DisposableEffect.
1. Объявить атрибут configChanges
Обновите элемент <activity> в манифесте приложения, добавив значения keyboard|keyboardHidden в список уже управляемых изменений конфигурации:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. Реагирование на изменения конфигурации клавиатуры
Чтобы обрабатывать изменения конфигурации в Jetpack Compose, используйте один из следующих вариантов в зависимости от того, обновляете ли вы пользовательский интерфейс или выполняете обратный вызов побочного эффекта:
Вариант А. Реактивный интерфейс (рекомендуется)
Считывайте тип клавиатуры непосредственно из
LocalConfiguration.current. Когда аппаратная клавиатура подключается или отключается, это значение меняется, и Compose автоматически перекомпонует ваш пользовательский интерфейс.val configuration = LocalConfiguration.current val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY if (isPhysicalKeyboardAttached) { // Render layout optimized for physical keyboard } else { // Render default layout }
Вариант Б. Прослушиватель побочных эффектов
Если при изменении конфигурации вам нужно запустить побочный эффект (например, ведение журнала, обновление локальной базы данных или запуск аналитики), используйте
DisposableEffect, чтобы зарегистрировать прослушиватель изменений конфигурации на хостеComponentActivity.val context = LocalActivity.current DisposableEffect(context) { val activity = context as? ComponentActivity val listener = Consumer<Configuration> { newConfig -> val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY // Trigger non-UI actions, analytics, etc. } activity?.addOnConfigurationChangedListener(listener) onDispose { activity?.removeOnConfigurationChangedListener(listener) } }
Результаты
Теперь ваше приложение будет реагировать на подключение или отключение внешней клавиатуры без повторного создания запущенного действия.
Дополнительные ресурсы
Чтобы узнать, как сохранить состояние пользовательского интерфейса приложения при изменении конфигурации, например при подключении или отключении клавиатуры, прочитайте статью Сохранение состояний пользовательского интерфейса.