es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Navegación del teclado en Android en Jetpack Compose

Estoy intentando implementar la navegación por teclado en Jetpack Compose.

Tengo un LazyColumn que contiene algunos elementos de lista como Row{} y todos los Row son clicables y reciben el enfoque. Lo que intento lograr es desplazarme al siguiente elemento de la lista después de llegar al final de la pantalla.

Después de presionar la tecla de flecha ABAJO / tecla TAB, el enfoque se detiene en la parte inferior de la pantalla y no se desplaza hacia abajo. ¿Estoy equivocado al esperar que esto suceda automáticamente? ¿Necesitamos usar eventos de teclado y cómo podemos utilizar los eventos de teclado para admitir el desplazamiento con el teclado en Jetpack Compose?

Código:

LazyColumn(
    modifier = Modifier
        .padding(horizontal = Spacing2X)
        .padding(top = Spacing2X)
) {
    items(SOME_LIST_HERE) {
        Row(modifier = Modifier.clickable { }) {
            Text(text = "")
        }
    }
}

Video de escenario: https://twitter.com/karan4c6/status/1479426842566094849

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para implementar la navegación mediante el teclado en Jetpack Compose para desplazarse al siguiente elemento en un LazyColumn, puedes utilizar eventos de teclado. Cuando el foco está en el último elemento visible y el usuario presiona la tecla de flecha ABAJO / TAB, puedes capturar el evento de tecla y desplazarte al siguiente elemento de la lista.

    Primero, debes proporcionar un focusOrder a cada Row cliqueable agregando un bloque remember al modificador Row. Esto asegurará que el orden de enfoque sea correcto al navegar a través de la lista con el teclado.

    Row(
        modifier = Modifier
            .clickable { }
            .remember { FocusOrder(order = it) }
    ) {
        Text(text = "")
    }
    

    A continuación, puedes agregar un callback onKeyEvent al modificador LazyColumn. Esto capturará los eventos de teclado y habilitará el desplazamiento al siguiente elemento de la lista cuando se presione la tecla de flecha ABAJO / TAB.

    LazyColumn(
        modifier = Modifier
            .padding(horizontal = Spacing2X)
            .padding(top = Spacing2X)
            .onKeyEvent { keyEvent ->
                if (keyEvent.type == KeyEventType.KeyDown) {
                    if (keyEvent.key == Key.Tab || keyEvent.key == Key.DirectionDown) {
                        val currentFocusIndex = LocalFocusManager.current.getFocusOrder().order
                        val itemCount = TAMANIO_DE_LA_LISTA
                        if (currentFocusIndex == itemCount - 1) {
                            // estamos en el último elemento, desplazarse al siguiente elemento
                            LocalScrollbar.current?.scrollBy(Unit, ScrollDirection.Bottom)
                            true
                        } else {
                            // no estamos en el último elemento, realizar la acción predeterminada
                            false
                        }
                    } else {
                        false
                    }
                } else {
                    false
                }
            }
    ) {
        items(LA_LISTA) { item ->
            Row(
                modifier = Modifier
                    .clickable { }
                    .remember { FocusOrder(order = it) }
            ) {
                Text(text = item)
            }
        }
    }
    

    El callback onKeyEvent verifica si el evento de tecla es una pulsación de tecla de flecha ABAJO o TAB, y si el foco está en el último elemento visible. Si lo está, se desplaza al siguiente elemento de la lista utilizando el método LocalScrollbar.current?.scrollBy(Unit, ScrollDirection.Bottom). Si no es así, realiza la acción predeterminada.

    Esta implementación debería permitir la navegación mediante el teclado en Jetpack Compose y el desplazamiento al siguiente elemento en un LazyColumn cuando se alcance la parte inferior de la pantalla.

Comments are closed.