Zmienianie kolejności przechodzenia pomiędzy elementami

W sekcji Domyślna kolejność przemierzania zaznaczenia opisano, jak funkcja Utwórz automatycznie dodaje do elementów funkcję przechodzenia po zaznaczeniu, zarówno w przypadku nawigacji jednowymiarowej (klawisz tab), jak i dwuwymiarowej (klawisze strzałek). W niektórych przypadkach może być konieczne zastąpienie tego domyślnego działania i podanie dokładniejszych informacji o wymaganej kolejności przemierzania.

Zastąp jednowymiarową kolejność przechodzenia

Aby zmienić domyślną kolejność przechodzenia przez zaznaczenie w nawigacji jednowymiarowej, utwórz zestaw odwołań, po jednym dla każdego elementu kompozycyjnego, który można zaznaczyć:

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

Następnie użyj modyfikatora focusRequester, aby powiązać każdy z nich z funkcją kompozycyjną:

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") }
    }
}

Możesz teraz użyć modyfikatora focusProperties, by określić niestandardową kolejność przechodzenia między elementami:

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")
        }
    }
}

Zastąp dwuwymiarową kolejność przechodzenia

Możesz też dodać precyzyjną kontrolę nad kolejnością przechodzenia pomiędzy fokusem, aby umożliwić dwuwymiarową nawigację za pomocą klawiszy strzałek. W przypadku każdego elementu możesz zastąpić domyślne miejsce docelowe nawigacji w przypadku poszczególnych wskazówek, dodając modyfikator focusProperties i wskazując element, który będzie się pojawiać, w dół lub w dowolnym innym kierunku:

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

Ta technika nie tylko skutecznie korzysta ze strzałek na klawiaturze, ale będzie też działać z padami kierunkowymi i gałkami do kontrolerów przewodowych i bezprzewodowych.