El teclado no se abre si el TextField dentro de LazyColumn está en la parte inferior de la pantalla.
Si te enfocas en un TextField cerca del fondo de la pantalla, el teclado aparece por un momento y luego se esconde inmediatamente. Pero si te enfocas en algún TextField desde arriba, el teclado se abre como de costumbre y puedes desplazarte hasta el fondo. Esto sucede si windowSoftInputMode está configurado como adjustResize. Si no se configura ninguno, entonces el comportamiento se vuelve aleatorio (el teclado puede superponerse al contenido y también puede empujar la barra de herramientas, etc.). Quizás simplemente esté haciendo todo esto mal, no lo sé. Me pregunto si alguien se ha enfrentado a este problema antes y podría darme una mano.
Código de muestra (para simplificar, mantengo los estados mutables aquí mismo, sin usar ViewModel):
@Composable
fun Greeting() {
Scaffold(topBar = {
TopAppBar(title = { Text(text = "Some title") })
}) {
val focusManager = LocalFocusManager.current
LazyColumn(
contentPadding = PaddingValues(all = 16.dp),
verticalArrangement = Arrangement.spacedBy(space = 16.dp)
) {
items(count = 20) { index ->
val (value, onValueChange) = rememberSaveable { mutableStateOf("Some value $index") }
TextField(
value = value,
onValueChange = onValueChange,
modifier = Modifier.fillMaxWidth(),
label = { Text(text = "Some label $index") },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
keyboardActions = KeyboardActions(onNext = {
if (!focusManager.moveFocus(FocusDirection.Down))
focusManager.clearFocus()
}),
singleLine = true
)
}
}
}
}
Versión de Compose 1.0.5
davy.ai
El problema mencionado en la pregunta está relacionado con el atributo
windowSoftInputMode
de la actividad en la que se utiliza la función componible. CuandowindowSoftInputMode
está configurado comoadjustResize
, el comportamiento del teclado es redimensionar el contenido de la actividad para acomodar el teclado, lo que puede causar el problema de que el teclado aparezca y desaparezca rápidamente cuando se enfoca unTextField
cerca de la parte inferior de la pantalla.Para solucionar este problema, una posible solución es utilizar un
ScrollableColumn
en lugar de unLazyColumn
y envolver los componentesTextField
en unBox
con una altura fija. Esto asegura que el contenido de la actividad siempre tenga la misma altura y que el teclado se comporte como se espera.Código de ejemplo con
ScrollableColumn
:Ten en cuenta que al
ScrollableColumn
se le ha asignado unmodifier
deModifier.fillMaxSize()
para ocupar el espacio disponible. Además, elTextField
envuelto en unBox
tiene una altura fija de64.dp
.Al utilizar este método, el teclado se abre como de costumbre y el usuario puede desplazarse hasta la parte inferior de la pantalla sin ningún problema.