Text en Jetpack Compose: da vida a tus textos
Antonio Leiva

Los textos son una parte imprescindible en cualquier interfaz de usuario, y por tanto es importante saber cómo usarlos y sacarles el máximo partido.

En Jetpack Compose, el Composable encargado de renderizar texto se llama simplemente Text (a diferencia del sistema clásico, donde era TextView).

En realidad, existe una versión más básica llamada BasicText, que no aplica las guías de estilo de Material, pero que en general no vamos a necesitar.

¡Atención! Si quieres acceder más rápido a todo el contenido en vídeo, organizado, con contenido extra, soporte y muchas más sorpresas, puedes apuntarte gratis a mi formación Compose Expert y ver gratis el primer módulo de más de 3 horas con todo lo necesario para empezar.

Ya hemos visto que mostrar un texto es muy fácil, solo necesitamos pasarle el texto a mostrar como argumento:

@Composable
fun Greeting(name: String) {
    Text("Hello $name!")
}

Si lo que queremos es obtener un string de los resources de Android, solo tenemos que usar la función stringResource():

Text(stringResource(R.string.hello_world))

Pero si te fijas, Text tiene muchos argumentos más, por lo que se pueden configurar de infinidad de formas:

text ya sabemos como funciona, y de Modifier ya tenemos un artículo entero. Así que vamos a ir viendo los siguientes:

color

Permite modificar el color de la fuente. Ya hemos visto que tenemos varios colores por defecto en el objeto Color:

Text(
    text = "Hello World",
    color = Color.Red
)

Color por supuesto tiene constructores para definir colores de distintas formas:

fontSize

Permite definir el tamaño de la fuente. El tipo es TextUnit, que permite definir el tamaño tanto en dp como en sp.

Text(
    text = "Hello World",
    fontSize = 25.sp
)

fontStyle

El estilo de fuente simplemente permite definir si el texto estará en cursiva (o itálica) o normal

Text(
    text = "Hello World",
    fontStyle = FontStyle.Italic
)

fontWeight

Define el peso de la fuente. La clásica negrita, pero a día de hoy las fuentes permiten definir varios niveles. Así que el Text también está adaptado para esto.

Hay un montón de opciones. Nosotros por ejemplo vamos a configurar ExtraBold:

Text(
    text = "Hello World",
    fontWeight = FontWeight.ExtraBold
)

fontFamily

Permite definir la fuente que el texto va a usar. Esto tiene su complejidad, así que también vamos a necesitar un artículo aparte. Déjame en comentarios si quieres que escriba sobre ello.

En cualquier caso hay varias fuentes genéricas que podemos utilizar:

Por ejemplo, si usamos Monospace:

Text(
    text = "Hello World",
    fontFamily = FontFamily.Monospace
)

Obtenemos esto:

letterSpacing

Identifica el espacio entre letras. Se puede indicar tanto en dp como en sp. Por ejemplo:

Text(
    text = "Hello World",
    letterSpacing = 5.sp
)

textDecoration

Decoraciones extra para el texto, como tachado, subrayado, o incluso se pueden definir combinaciones de ambas.

Text(
    text = "Hello World",
    textDecoration = TextDecoration.LineThrough
)

textAlign

Alineación del texto en el párrafo: izquierda, derecha, centrado, justificado…

He cambiado el texto a uno más largo para que podamos ver este y alguno de los siguientes:

Text(
    text = stringResource(id = R.string.lorem),
    textAlign = TextAlign.End
)

lineHeight

Altura de línea, sirve para separar más o menos las líneas entre sí. Se pueden utilizar sp y em. Los em identifican el tamaño de la letra: 1 em es igual a la altura de la fuente.

Si dejamos 2em:

Text(
    text = stringResource(id = R.string.lorem),
    lineHeight = 2.em
)

maxLines, textOverflow y softWrap

Estos tres funcionan en conjunto. Imaginemos que indicamos que el número de líneas máximos es de 1:

Text(
    text = stringResource(id = R.string.lorem),
    maxLines = 1
)

Solo veríamos una línea, con el resto del texto cortado:

¿Cómo definimos la forma de cortarlo? Por defecto softWrap es true, lo que indica que cortará por la última palabra completa, pero lo podemos desactivar:

Text(
    text = stringResource(id = R.string.lorem),
    maxLines = 1,
    softWrap = false
)

Por defecto el texto se corta con TextOverflow.Clip, lo que quiere decir que simplemente se corta donde está, pero podemos usar TextOverflow.Ellipsis, y se cortará con puntos suspensivos…

Text(
    text = stringResource(id = R.string.lorem),
    maxLines = 1,
    softWrap = false,
    overflow = TextOverflow.Ellipsis
)

onTextLayout

Es un listener que nos devuelve un TextLayoutResult cuando la disposición del texto termina de calcularse.

Devuelve un montón de información sobre cómo se ha mostrado el texto, si hubo overflow, número de líneas, tamaño, y un largo etcétera.

Se puede usar para añadir funcionalidad extra, decoraciones al texto y otro tipo de detalles. Si te interesa un artículo sobre esto, házmelo saber también en los comentarios, porque es un tema complejo para tratarlo aquí.

style

Todos estos parámetros que hemos visto, e incluso algunos más, se pueden configurar directamente en este style. Muchos de ellos no tendrás que usarlos casi nunca, así que no vamos a entrar a fondo.

Pero sí que es interesante saber que gracias a este estilo, podemos aplicar de forma sencilla las tipografías definidas en el tema.

Si te vas a Type.kt, verás que hay definido un objeto Typography. Eso objeto permite definir todos los niveles de tipografía especificados por las guías de Material Design.

Si no se configura, utilizará los valores por defecto. En ese archivo puedes ver algunos ejemplos.

Todas las tipografías del tema se pueden usar de forma muy sencilla desde MaterialTheme.typography. Por ejemplo:

Text(
    text = "Hello World",
    style = MaterialTheme.typography.h4
)

Si necesitas usar una tipografía, pero aplicándole algún cambio, puedes usar la función copy de las data class. Vamos a aplicar una sombra:

Text(
    text = "Hello World",
    style = MaterialTheme.typography.h4.copy(
        shadow = Shadow(
            offset = Offset(10f, 10f),
            blurRadius = 10f
        )
    )
)

Aplicando lo aprendido a nuestro ejemplo

Aquí tampoco vamos a hacer muchos cambios. Simplemente le vamos a aplicar una tipografía al título:

Text(
    text = "Title 1",
    style = MaterialTheme.typography.h6
)

Con esto que has aprendido hoy vas a poder configurar cualquier texto que se te presente para que se adapte a las necesidades del diseño.

Pero esto se nos está quedando ya un poco cojo sin poder cargar imágenes. Así que en el próximo artículo vamos a hablar sobre cómo mostrar imágenes y drawables en Jetpack Compose.

Si no quieres perderte nada y además acceder de forma prioritaria, con soporte y con extras a todo este contenido, apúntate mi curso gratuito ya mismo.

Apúntate ahora a Compose Expert y accede a más de 3h de contenido gratuito, soporte, extras y mucho más totalmente gratis.

Quizá también te interese…

Temas, colores, tipografías y formas en Jetpack Compose

Temas, colores, tipografías y formas en Jetpack Compose

Si vienes del sistema clásico de vistas, recordarás que toda la definición de temas se hacía de una forma bastante tediosa a través de styles en XML. Si odias tu vida (o estás en una App donde mezclas XMLs y Jetpack Compose), aún puedes seguir usando esos temas...

Usando Cards de Material Design en Jetpack Compose

Usando Cards de Material Design en Jetpack Compose

Tenemos ya una App de lo más resultona después de todos los artículos que hemos visto hasta ahora. Puedes encontrarlos todos bien ordenaditos de forma gratuita en el área privada de Compose Expert. https://youtu.be/iZiXpWRIl3U Pero antes de finalizar nuestro camino,...

Navegación en Jetpack Compose con Navigation Compose

Navegación en Jetpack Compose con Navigation Compose

Jetpack Compose es un cambio de paradigma enorme en muchos aspectos. Cambia la forma de pensar en casi todos los puntos involucrados en el desarrollo de una App Android. Y la navegación no iba a ser menos. ¿Cómo se navega en Jetpack Compose? ¿Qué opciones tenemos?...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de DevExpert, S.L.U., con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *