Порядок перемещения фокуса

Пользователи могут перемещать фокус клавиатуры между элементами пользовательского интерфейса с помощью клавиши Tab или клавиш направления (стрелки / D-pad):

  • Tab / Shift+Tab : Перемещает фокус вперед или назад в порядке отображения объектов в одном измерении.
  • Клавиши управления: перемещение фокуса в двух измерениях ( Вверх , Вниз , Влево и Вправо ).

Одномерное перемещение фокуса

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

Например, когда четыре кнопки расположены в ряд:

Column {
    Row {
        Button(onClick = { /* ... */ }) { Text("1st") }
        Button(onClick = { /* ... */ }) { Text("2nd") }
    }
    Row {
        Button(onClick = { /* ... */ }) { Text("3rd") }
        Button(onClick = { /* ... */ }) { Text("4th") }
    }
}

Нажатие клавиши Tab последовательно перемещает фокус между кнопками в следующем порядке:

  1. 1-я кнопка (верхний запуск)
  2. 2-я кнопка (верхний край)
  3. 3-я кнопка (нижняя кнопка запуска)
  4. 4-я кнопка (нижний край)

Нажатие клавиши Tab на последнем элементе возвращает фокус на первый целевой объект. Нажатие Shift+Tab перемещает фокус в обратном порядке.

Двумерное перемещение фокуса

Нажатие клавиш со стрелками на клавиатуре или использование D-pad запускает двухмерное перемещение фокуса.

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

Двумерное перемещение фокуса не переносится на следующий экран . Если пользователь нажимает клавишу «Вниз» , находясь в фокусе на самом нижнем элементе, фокус остается на этом элементе, а не перемещается в верхнюю часть экрана.

Сброс перемещения фокуса щелчками указателя мыши

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

  • Четкая фокусировка при касании или щелчке : щелчок или касание неинтерактивного пространства мышью или сенсорной панелью освобождает фокус от активного элемента.
  • Перезапуск обхода : После сброса фокуса следующее нажатие клавиши Tab перезапускает одномерный обход с первого целевого объекта в порядке его визуального появления, а не возобновляет обход с ранее активного элемента. Это аналогично двумерному обходу фокуса. Клавиши направления перемещают фокус клавиатуры к ближайшему целевому объекту в нужном направлении.

Подробную информацию о программной очистке фокуса см. в разделе «Перемещение и очистка фокуса» .

Настройка порядка перемещения фокуса

Вы можете настроить поведение при перемещении по карте с помощью модификатора focusProperties .

Настройка порядка одномерного обхода

Чтобы отключить одномерный обход, укажите свойство next или previous с помощью FocusRequester :

  1. Создайте объект FocusRequester с remember { FocusRequester() } .
  2. Прикрепите FocusRequester к целевому компонуемому объекту, используя модификатор focusRequester .
  3. Примените модификатор focusProperties к исходному составному элементу и назначьте FocusRequester на next (для Tab ) или previous (для Shift+Tab ).

val (first, second, third) = remember { FocusRequester.createRefs() }

Column {
    Button(
        onClick = { /* ... */ },
        modifier = Modifier
            .focusRequester(first)
            .focusProperties { next = third }
    ) {
        Text("First (Tab jumps to Third)")
    }
    Button(
        onClick = { /* ... */ },
        modifier = Modifier.focusRequester(second)
    ) {
        Text("Second")
    }
    Button(
        onClick = { /* ... */ },
        modifier = Modifier.focusRequester(third)
    ) {
        Text("Third")
    }
}

Настройка порядка обхода в двух измерениях.

Аналогичным образом, вы можете переопределить двухмерное перемещение фокуса, назначив экземплярам FocusRequester значения up , down , start , end , left или right в focusProperties :

val (topButton, bottomButton) = remember { FocusRequester.createRefs() }

Button(
    onClick = { /* ... */ },
    modifier = Modifier
        .focusRequester(topButton)
        .focusProperties {
            down = bottomButton
            right = bottomButton
        }
) {
    Text("Top button")
}
Button(
    onClick = { /* ... */ },
    modifier = Modifier.focusRequester(bottomButton)
) {
    Text("Bottom button")
}

Чтобы заблокировать навигацию по фокусу в определенном направлении (например, на границах макета), присвойте свойству FocusRequester.Cancel (например, down = FocusRequester.Cancel ). Чтобы явно сохранить алгоритм обхода по умолчанию для заданного направления, присвойте FocusRequester.Default .

{% verbatim %} {% endverbatim %} {% verbatim %} {% endverbatim %}