Saltar a contenido

2.2 Botones y eventos

Un botón necesita dos cosas: qué muestra y qué hace al pulsarlo. Lo segundo se escribe en el parámetro onClick, que recibe una lambda.

Button(onClick = { Log.d("APP", "Me han pulsado") }) {
    Text("Pulsa aquí")
}

El contenido del botón va entre llaves, y puede ser texto, un icono o ambos.

Los tipos de botón de Material 3

Composable Aspecto Cuándo usarlo
Button Relleno de color La acción principal de la pantalla
FilledTonalButton Relleno suave Acción importante pero secundaria
OutlinedButton Solo borde Acción secundaria
TextButton Solo texto Acciones poco importantes (Cancelar)
IconButton Solo un icono Barras de herramientas
FloatingActionButton Círculo flotante La acción estrella (añadir)
Column {
    Button(onClick = { }) { Text("Guardar") }
    OutlinedButton(onClick = { }) { Text("Editar") }
    TextButton(onClick = { }) { Text("Cancelar") }
    IconButton(onClick = { }) { Icon(Icons.Default.Favorite, contentDescription = "Favorito") }
    FloatingActionButton(onClick = { }) { Icon(Icons.Default.Add, contentDescription = "Añadir") }
}

Desactivar un botón

Button(onClick = { enviar() }, enabled = false) {
    Text("Enviar")
}

Con enabled = false el botón se ve apagado y no responde. Es útil para impedir enviar un formulario incompleto.

Un mensaje al pulsar: Toast

val contexto = LocalContext.current
Button(onClick = {
    Toast.makeText(contexto, "Guardado", Toast.LENGTH_SHORT).show()
}) { Text("Guardar") }

El Toast es un aviso breve que desaparece solo. Necesita un Context, que se obtiene con LocalContext.current.

Pulsación larga y doble toque

Button solo conoce el toque normal. Para otros gestos se usa el modificador combinedClickable (API marcada como experimental: añade @OptIn(ExperimentalFoundationApi::class) a la función):

Text(
    "Mantén pulsado",
    modifier = Modifier.combinedClickable(
        onClick = { },
        onLongClick = { Log.d("APP", "Pulsación larga") },
        onDoubleClick = { Log.d("APP", "Doble toque") }
    )
)

Un botón no es un texto con clickable

Cualquier composable se puede hacer pulsable con Modifier.clickable { }. Pero un Button ya trae el área táctil correcta, el efecto de ondas y la accesibilidad. Úsalo siempre que haya una acción.