Изменить порядок обхода фокуса

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

Переопределить одномерный порядок обхода

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

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

Затем используйте модификатор focusRequester , чтобы связать каждый из них с составным объектом:

Column {
    Row {
        TextButton({}, Modifier.focusRequester(first)) { Text("First field") }
        TextButton({}, Modifier.focusRequester(third)) { Text("Third field") }
    }

    Row {
        TextButton({}, Modifier.focusRequester(second)) { Text("Second field") }
        TextButton({}, Modifier.focusRequester(fourth)) { Text("Fourth field") }
    }
}

Теперь вы можете использовать модификатор focusProperties , чтобы указать собственный порядок обхода:

Column {
    Row {
        TextButton(
            {},
            Modifier
                .focusRequester(first)
                .focusProperties { next = second }
        ) {
            Text("First field")
        }
        TextButton(
            {},
            Modifier
                .focusRequester(third)
                .focusProperties { next = fourth }
        ) {
            Text("Third field")
        }
    }

    Row {
        TextButton(
            {},
            Modifier
                .focusRequester(second)
                .focusProperties { next = third }
        ) {
            Text("Second field")
        }
        TextButton(
            {},
            Modifier
                .focusRequester(fourth)
                .focusProperties { next = first }
        ) {
            Text("Fourth field")
        }
    }
}

Переопределить двумерный порядок обхода

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

TextButton(
    onClick = {},
    modifier = Modifier
        .focusRequester(fourth)
        .focusProperties {
            down = third
            right = second
        }
) {}

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

{% дословно %} {% дословно %} {% дословно %} {% дословно %}