¿Hay alguna solución lista para usar para limitar el tamaño de los caracteres en TextField's? No veo ningún parámetro maxLength como el que teníamos en XML.
Con 1.xy no hay un parámetro integrado. Puedes usar algo como:
var text by remember { mutableStateOf(TextFieldValue("")) } val maxChar = 5 TextField( singleLine = true, value = text, onValueChange = { if (it.length <= maxChar) text = it } )Otra forma de hacer esto que podría considerarse más flexible es algo como:
Text( text = "A string with a lot of charsssssssssssssssssssssssssss" modifier = Modifier.fillMaxWidth(.5f), maxLines = 1, overflow = TextOverflow.Ellipsis ) esto restringirá el ancho con el bit fillMaxWidth y el alto con la parte maxLines . Si se alcanzan ambas restricciones, el texto se desbordará y se puede especificar el comportamiento para el desbordamiento.
en este caso, una vez que el texto ocupaba la mitad de la vista o pasaba más de una línea, terminaría algo así como A string with a lot of charsssss...
La primera respuesta a esta pregunta funciona bien, pero es cierto que en algunos casos hay un error que al exceder la cantidad de caracteres permitidos, se borra el valor del texfield. Esta falla parece deberse al texto predictivo, porque si el texto predictivo está deshabilitado en Android, no sucede. Una solución que encontré por ahora como solución alternativa es usar focusManager para "limitar la escritura".
Primero, necesitamos que el administrador de enfoque controle el enfoque en la pantalla. Podemos hacer esto agregando esta línea dentro de nuestra función componible:
val focusManager = LocalFocusManager.currentLuego, en nuestro TextField podemos usar el focusManager para evitar que el usuario escriba más que el límite maxChar. Podemos mover el foco al siguiente elemento, borrar el foco cuando se supere el límite de maxChar o recibir una función lambda y realizar la acción que queramos. Eso depende de nosotros.
var text by remember { mutableStateOf(TextFieldValue("")) } val maxChar = 10 TextField( singleLine = true, value = text, onValueChange = { // This line will take (in case the user try to paste a text from the clipboard) only the allowed amount of characters text = it.take(maxChar) if (it.length > maxChar){ focusManager.moveFocus(FocusDirection.Down) // Or receive a lambda function } } )De esta forma el usuario nunca podrá escribir más caracteres de los establecidos por el límite. Obviamente, esta es una solución alternativa, que en mi caso resolvió mi problema, ahora toca esperar a ver si lo agregan de forma nativa.