Domina la Declaración y Gestión de Cadenas en Android Studio para Apps Imbatiblespost-template-default single single-post postid-46 single-format-standard et_pb_button_helper_class et_fixed_nav et_show_nav et_secondary_nav_enabled et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db
771 715 4434

En el desarrollo de aplicaciones para Android, la gestión adecuada de las cadenas de texto es fundamental tanto para la funcionalidad como para la experiencia del usuario. Esta guía explorará cómo declarar, manipular y estilizar cadenas utilizando Java, Kotlin y los recursos específicos de Android Studio.

Fundamentos de Cadenas en Java y Kotlin

¿Qué es una Cadena?

En programación, las cadenas se utilizan con mucha frecuencia. Una cadena en Java es un objeto que representa una secuencia de caracteres respaldada por una matriz de caracteres. La clase String es inmutable en Java e implementa interfaces Comparable, Serializable y CharSequence. Como ahora sabemos, la matriz es inmutable, lo que significa que no se puede cambiar después de la inicialización, por lo tanto, la cadena también es inmutable.

Declaración y Tipos de Cadenas

La forma más sencilla y directa de declarar una cadena es mediante un literal de cadena. Siempre que el compilador interpreta un literal de cadena, siempre se convierte en el objeto String. También podemos inicializar una cadena usando el nuevo operador.

String greeting = "¡Hola!"; // Declaración con literalString message = new String("Bienvenido"); // Declaración con nuevo operador

Cadenas Mutables: StringBuilder y StringBuffer

Como sabemos, el objeto de clase String es inmutable; cada vez que necesitamos cambiar la cadena, nunca muta el objeto actual, pero el valor modificado siempre se almacena como un nuevo objeto String. Entonces, si necesitamos cambiar el valor, una y otra vez, también se consumirá memoria. Manteniendo este punto, Java nos ha proporcionado las clases StringBuilder y StringBuffer.

StringBuffer

String es una representación de una secuencia inmutable de caracteres, pero StringBuffer es una secuencia mutable de caracteres. Utiliza la mayoría de los métodos de la clase String junto con algunos propios para cambiar el contenido y la secuencia de caracteres. Es seguro para subprocesos porque sus métodos están sincronizados para su uso por múltiples subprocesos, manteniendo el orden en serie.

Lea también: Top apps contables para Android

StringBuilder

StringBuilder también representa la secuencia mutable de caracteres. Proporciona una API que es compatible con la clase StringBuffer pero no es segura para subprocesos. Entonces, cuando no hay múltiples subprocesos involucrados, es mejor utilizar la clase StringBuilder ya que es más rápida que la clase StringBuffer en muchos casos. Los métodos clave de esta clase son insertar y agregar. También implementa las interfaces Serializable, Appendable y CharSequence.

Operaciones Comunes de Cadenas

En Java podemos realizar operaciones de cadenas como concatenación, comparación, división, búsqueda de longitud, reemplazo de cadenas, etc. La clase Java String proporciona varios métodos para manipular las cadenas o realizar las operaciones comentadas anteriormente.

Strings en Kotlin para Desarrollo Android

Los strings y string templates son compañeros indispensables en Kotlin. Te permiten manipular texto de manera efectiva y darle vida a tus mensajes. En Kotlin, los strings son secuencias de caracteres que nos permiten almacenar y manipular texto. Imagina una caja llena de letras y símbolos que pueden combinarse para formar palabras y frases. En lugar de manejar un solo carácter, como lo hacíamos con el tipo de dato char, ahora podemos trabajar con una secuencia completa.

Declaración Básica y String Templates

Para declarar un string en Kotlin, podemos usar la palabra clave val seguida del nombre de la variable y asignarle el valor entre comillas dobles. Los string templates son una joya en Kotlin. Para crear un string template, utilizamos el signo de dólar ($) seguido del nombre de la variable o la expresión encerrada en llaves.

val nombre = "Mundo"val saludo = "Hola, $nombre!" // String Templateval precio = 15.25val impuesto = 0.16val total = "El total es: $${precio * (1 + impuesto)}" // Expresión en template

Aunque los string templates son como una caja de herramientas mágica, no te excedas. Utilízalos de manera inteligente para no llenar tu código con lógica compleja.

Lea también: Herramientas digitales esenciales para la fiscalidad de apps

Recursos de Cadenas en Android (strings.xml)

La idea fundamental es tener todos los mensajes que muestra nuestra aplicación en un archivo (strings.xml) para facilitar la localización y el mantenimiento. Un recurso de cadenas proporciona cadenas de texto para tu aplicación con formato y estilo de texto opcionales. Todas las cadenas pueden aplicar algunos argumentos de formato y marcado de estilo.

Estructura y Tipos de Recursos de Cadenas

Los recursos de cadena se definen en un archivo XML, comúnmente en res/values/filename.xml (el nombre del archivo es arbitrario).

Tipo de Recurso Descripción Ejemplo Básico
<string> Cadena de texto simple, obligatoria, puede incluir etiquetas de estilo. Nombre para la cadena.
<string name="app_name">Mi Aplicación</string>
<string-array> Define un array de strings. Es un nombre para el array.
<string-array name="nombres_frutas">
<item>Manzana</item>
<item>Pera</item>
</string-array>
<plurals> Una colección de cadenas, de las cuales se proporciona una cadena según la cantidad de algún elemento. Nombre para el par de cadenas.
<plurals name="numero_canciones">
<item quantity="one">%d canción</item>
<item quantity="other">%d canciones</item>
</plurals>

Lo que se encuentra entre las marcas <string> es lo que se visualizará, por ejemplo en la constante app_name se almacena el valor "Proyecto044". Estos recursos se asocian a los controles visuales, como RadioButton y Button, para mostrar mensajes en la interfaz de usuario.

Cadenas de Cantidad (Plurales)

Los diferentes idiomas tienen distintas reglas de concordancia gramatical con la cantidad. Si bien históricamente se llamaron "cadenas de cantidad" (y aún se llaman así en la API), las cadenas de cantidad solo deben usarse para los plurales. La selección de la cadena que se debe usar se realiza únicamente según la necesidad gramatical.

Por ejemplo, en inglés, una cadena para zero se ignora incluso si la cantidad es 0, ya que 0 no es gramaticalmente diferente de 2, o cualquier otro número, excepto 1 ("zero books", "one book", "two books", y así sucesivamente). No te confundas por el hecho de que, por ejemplo, two suena como si solo pudiera aplicarse a la cantidad 2: un idioma puede requerir que 2, 12, 102 (y así sucesivamente) se traten de manera similar, pero de forma diferente de otras cantidades. Si tu mensaje no contiene el número de cantidad, es probable que no sea un buen candidato para un plural. En ocasiones, es posible evitar las cadenas de cantidad usando fórmulas de cantidad neutra, por ejemplo, "Libros: 1".

Lea también: Uso de atributos con valores iniciales en Kotlin

Cuando se usa la función pluralStringResource() (en Compose), debes pasar count dos veces si tu cadena incluye formato de cadena con un número. Por ejemplo, para la string %d songs found, el primer parámetro de count selecciona el plural adecuado, y el segundo parámetro de count se inserta en el marcador de posición %d.

Escapado de Caracteres y Formato HTML

Cuando una cadena contiene caracteres que tienen un uso especial en XML, debes escapar los caracteres de acuerdo con las reglas de escape estándar de XML/HTML. De forma predeterminada, Android contraerá secuencias de caracteres de espacios en blanco en un solo espacio. Para evitar esto, encierra la parte relevante de la cadena entre comillas dobles. En este caso, todos los caracteres de espacios en blanco (incluidas las nuevas líneas) se conservarán dentro de la región entrecomillada. La contracción del espacio en blanco y el escape de Android ocurren después de que se analiza tu archivo de recursos como XML.

Puedes agregar estilo a tus strings con el lenguaje de marcado HTML. Por ejemplo, para configurar propiedades de la fuente: <font face="font_family" color="hex_color">. En las cadenas con formato, se puede agregar un elemento <b>, como en el siguiente ejemplo:

<string name="welcome_message">Hello, <b>%1$s</b>!</string>

Estilización Avanzada de Cadenas en la UI de Android

Resaltado y Estilo en TextViews (Sistema de Vistas)

En casi todos los proyectos nos ha tocado lidiar con un resaltado de cadenas o palabras dentro del contenido de un TextView: enlaces, palabras en negrita, etc. También, es muy común que, además del resaltado, se añada un evento como abrir un navegador web (en el caso de los enlaces).

Uso de SpannableString

El SDK de Android ofrece la opción de SpannableString para poder establecer estilos a cadenas dentro de un TextView. Sin embargo, como se puede ver, el código necesario para poder resaltar cadenas es demasiado extenso:

final SpannableString text = new SpannableString("Hello stackOverflow");text.setSpan(new RelativeSizeSpan(1.5f), text.length()-"stackOverflow".length(), text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);text.setSpan(new ForegroundColorSpan(Color.RED), 3, text.length() - 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);tv.setText(text);

Simplificando con HighlightTextView

Esto se puede hacer de una forma sencilla usando HighlightTextView. HighlightTextView es un componente que permite resaltar contenido dentro del texto de un TextView. Además, te permite añadir evento en cada resaltado realizado. Para ello, HighlightTextView se apoyará en SpannableString.

Características Principales de HighlightTextView:
  • Resaltar una cadena.
  • Añadir el evento onClick en la cadena elegida.
  • Personalizar con un estilo la cadena a resaltar.
  • Añadir múltiples estilos.
  • Empezar a buscar la cadena en una posición determinada.
  • Establecer el número de ocurrencias que se quieren resaltar.
  • Ignorar mayúsculas y minúsculas.
  • Configurarse a través de XML o por código.
  • Trabaja con TextView personalizados.
Opciones Disponibles desde XML:
  • htv_highlight_text: Cadena a buscar en el texto del TextView. Valor obligatorio.
  • htv_start_position_occurrence: Posición desde donde empieza a buscar la subcadena. Por defecto, posición 0.
  • htv_limit: Número de palabras que se quieren encontrar. Por defecto, todas. Opciones disponibles: All, First, NumLimit(num), Default.
  • htv_highlight_style: Establece el estilo de la cadena a buscar.
Opciones Configurables por Código:
  • textToHighLight: Cadena a buscar en el texto del TextView. Valor obligatorio.
  • clickHighlightText: Acción que se ejecuta tras hacer click en la cadena resaltada. Por defecto None.
  • startPositionOccurrence: Posición desde donde empieza a buscar la subcadena. Por defecto, posición 0.
  • limit: Número de palabras que se quieren encontrar. Por defecto, todas. Opciones disponibles: All, First, NumLimit(num), Default.
  • styleHighlightText: Establece el estilo de la cadena a buscar. Por defecto, BOLD.
  • ignoreCase: Establece si se quiere o no ignorar las mayúsculas de las minúsculas.

Cadenas con Estilos en Jetpack Compose (AnnotatedString)

Un AnnotatedString es un objeto de texto de Compose al que puedes dar estilo con propiedades como el color y el grosor de la fuente. Para aplicar color, tamaño de fuente y decoración de texto, usa SpanStyle.

Compilar el AnnotatedString directamente es el enfoque recomendado para las apps en un solo idioma o el texto estático en Compose. Para las cadenas que necesitan un diseño y una traducción personalizados, define la etiqueta <annotation> en el strings.xml de cada configuración regional. Los traductores conservan la anotación, independientemente de dónde se ubique en la oración. La etiqueta <annotation> en tu archivo XML no se modificará. Solo difiere el código de recuperación.

En algunos casos, es posible que desees crear un recurso de texto con estilo que también se use como una cadena de formato. La solución temporal para esto es escribir las etiquetas HTML con entidades escapadas, que se recuperan después con AnnotatedString.fromHtml() una vez que se lleva a cabo el formato.

tags: #android #studio #declaracion #de #cadenas #ejemplos