Съемное управление с клавиатуры

Значок трехзвездочного рейтинга

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

Во всех случаях все данные, относящиеся к клавиатуре, хранятся в объекте Configuration . Поля keyboard и keyboardHidden объекта Configuration содержат информацию о типе клавиатуры и ее доступности.

Передовые методы

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

Поддержка внешних клавиатур предполагает изменение настроек, которое можно осуществить двумя способами:

  1. Позвольте системе воссоздать запущенную активность, а вы позаботьтесь об управлении состоянием вашего приложения.
  2. Внесите изменения в конфигурацию самостоятельно (действие не будет создано заново):
    • Объявить все значения конфигурации, связанные с клавиатурой.
    • Создайте обработчик изменений конфигурации.

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

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

В Jetpack Compose вы можете реагировать на изменения настроек клавиатуры двумя способами:

  1. Реактивный пользовательский интерфейс: считывайте текущее состояние конфигурации непосредственно в ваших компонуемых объектах с помощью LocalConfiguration.current . Пользовательский интерфейс автоматически перестраивается, чтобы адаптироваться к новому состоянию при подключении или отключении клавиатуры.
  2. Обратный вызов побочного эффекта: используйте DisposableEffect , учитывающий жизненный цикл, чтобы зарегистрировать слушатель изменения конфигурации в хост-активности, что позволяет запускать события, не связанные с пользовательским интерфейсом (например, логирование или аналитика), без пересоздания активности или создания каких-либо фиктивных элементов представления.

Ингредиенты

  • android:configChanges : Атрибут элемента <activity> в манифесте приложения. Информирует систему об изменениях конфигурации, которыми управляет приложение.
  • LocalConfiguration : Составной локальный поставщик, предоставляющий доступ к текущей Configuration устройства.
  • DisposableEffect : Создает API побочных эффектов, который выполняет блок кода при входе Composable в композицию и выполняет очистку при выходе из нее.

Шаги

Объявите атрибут configChanges и добавьте значения, связанные с клавиатурой, чтобы предотвратить повторное создание активности. Затем используйте либо LocalConfiguration.current для динамической адаптации вашей компонуемой раскладки, либо зарегистрируйте слушатель конфигурации с помощью DisposableEffect .

1. Объявите атрибут configChanges .

Обновите элемент <activity> в манифесте приложения, добавив значения keyboard|keyboardHidden в список уже измененных параметров конфигурации:

<activity
            android:configChanges="...|keyboard|keyboardHidden">

2. Реагировать на изменения настроек клавиатуры.

Для обработки изменений конфигурации в Jetpack Compose используйте один из следующих вариантов в зависимости от того, обновляете ли вы пользовательский интерфейс или выполняете обратный вызов с побочным эффектом:

  • Вариант A: Реактивный пользовательский интерфейс (рекомендуется)

    Тип клавиатуры считывается непосредственно из 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
    }

  • Вариант B: Слушатель побочных эффектов

    Если вам необходимо выполнить побочный эффект (например, запись в лог, обновление локальной базы данных или запуск аналитики) при изменении конфигурации, используйте 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)
        }
    }

Результаты

Теперь ваше приложение будет реагировать на подключение или отключение внешней клавиатуры без повторного создания запущенной активности.

Дополнительные ресурсы

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