¿Es posible establecer múltiples estilos para diferentes fragmentos de texto dentro de un TextView?
Por ejemplo, estoy configurando el texto de la siguiente manera:
tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);
¿Es posible tener un estilo diferente para cada elemento de texto? Por ejemplo, línea1 negrita, palabra1 cursiva, etc.
Las tareas comunes de la guía del desarrollador y cómo hacerlas en Android incluyen seleccionar, resaltar o diseñar partes de texto :
// Get our EditText object. EditText vw = (EditText)findViewById(R.id.text); // Set the EditText's text. vw.setText("Italic, highlighted, bold."); // If this were just a TextView, we could do: // vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE); // to force it to use Spannable storage so styles can be attached. // Or we could specify that in the XML. // Get the EditText's internal text storage Spannable str = vw.getText(); // Create our span sections, and assign a format to each. str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Pero eso usa números de posición explícitos dentro del texto. ¿Hay una forma más limpia de hacer esto?
Respuestas:
En caso de que alguien se pregunte cómo hacer esto, aquí hay una manera: (¡Gracias a Mark nuevamente!)
Para obtener una lista no oficial de etiquetas compatibles con este método, consulte este enlace o esta pregunta: ¿Qué etiquetas HTML son compatibles con Android TextView?
fuente
formatTextWhite(string text)
que simplemente inserta el texto en la cadena siguiente formato:"<font size="..." color="..." face="...">%s</font>"
.Html.fromHtml("<![CDATA[<font color='#ffff5400'>the html content you already have</font>]]>");
? Recuerdo que esto me funcionó alguna vez. No estoy seguro si aún funciona.Html.fromHtml("<font color=\"#999999\">
las secuencias de escape trabajaron para mí:) ...mBox..setText(Html.fromHtml("<b>" + name + "</b>") + doNotApplyHTML);
ninguna idea graciasPruebe
Html.fromHtml()
y marque su texto con etiquetas HTML en negrita y cursiva, por ejemplo:fuente
monthText + " " + month.getYearLabel()
. VerStringUtils.concat()
.monthYearLabel.setText(Html.fromHtml("<b>"+month.getMonthLabel().toUpperCase()+"</b> "+month.getYearLabel()))
si no necesita las piezas individuales.Ligeramente fuera de tema, pero encontré esto demasiado útil para no ser mencionado aquí.
¿Qué pasaría si quisiéramos leer el texto HTML del recurso string.xml y así facilitar la localización? CDATA hace esto posible:
Desde nuestro código Java ahora podríamos utilizarlo así:
No esperaba que esto funcionara. Pero lo hizo.
¡Espero que sea útil para algunos de ustedes!
fuente
"@string/someText"
(donde "someText" es un recurso definido en strings.xml), solo obtengo la cadena con todas las etiquetas HTML como 'texto'.Si no tiene ganas de usar html, puede crear un styles.xml y usarlo así:
fuente
$1%s is a happy $2%s
en paquetes de cuerdas. tienes que permitir que las fichas se reorganicen.Es más ligero usar un
SpannableString
marcado en lugar de html. Me ayuda a ver ejemplos visuales, así que aquí hay una respuesta complementaria.Este es un sencillo
TextView
.Estudio adicional
Este ejemplo fue originalmente inspirado desde aquí .
fuente
La lista de etiquetas compatibles es:
(De http://developer.android.com/guide/faq/commontasks.html#selectingtext - Enlace al archivo web, ¡el
<resource>
error tipográfico está en original!)También muestra que
Html.fromHtml
no es realmente necesario en casos simples.fuente
Me encontraba con el mismo problema. Podría usar fromHtml, pero ahora soy Android, no web, así que decidí probar esto. Sin embargo, tengo que localizar esto, así que lo probé usando el concepto de reemplazo de cadena. Establezco el estilo en TextView para que sea el estilo principal, luego simplemente formateo los otros pedazos.
Espero que esto ayude a otros que buscan hacer lo mismo. No sé por qué esto no es más fácil en el marco.
Mis cuerdas se ven así:
Aquí están los estilos:
Aquí está mi código que llama a mi método formatStyles:
El método de formato:
fuente
Ahora el
<b>
elemento está en desuso.<strong>
se representa como<b>
y se<em>
representa como<i>
.Esto funciona bien para mi
fuente
Aquí hay una manera fácil de hacerlo usando HTMLBuilder
Resultado:
Algún texto en negrita Algún texto en cursiva
fuente
Si desea poder agregar el texto con estilo en xml, puede crear una vista personalizada que extienda TextView y anule setText ():
Luego, puede usarlo así (reemplace
PACKAGE_NAME
con el nombre de su paquete):fuente
Como se dijo, use
TextView.setText(Html.fromHtml(String))
Y use estas etiquetas en su cadena con formato HTML:
http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html
fuente
Yo también
¿Qué tal usar un marcado hermoso con Kotlin y Anko ?
fuente
Sí, es posible usarlo
SpannedString
. Si está utilizando Kotlin, se vuelve aún más fácil hacerlocore-ktx
, ya que proporciona un lenguaje de dominio específico (DSL) para hacer esto:Más opciones proporcionadas por él son:
Por fin, solo puedes:
fuente
De hecho, excepto el objeto Html, también podría usar las clases de tipo Spannable, por ejemplo, TextAppearanceSpan o TypefaceSpan y SpannableString togather. La clase HTML también usa estos mecanismos. Pero con las clases de tipo Spannable, tienes más libertad.
fuente
Puede ser tan simple como aprovechar el método length () de String:
Divida la cadena de texto en el archivo XML de cadenas en tantas subcadenas ( cadenas separadas desde el punto de vista de Android) como necesite diferentes estilos, por lo que podría ser como: str1, str2, str3 (como en su caso), que cuando se unen son toda la cadena que usas.
Y luego simplemente siga el método "Span", tal como lo presentó con su código, pero en lugar de una sola cadena, combine todas las subcadenas fusionándolas en una sola, cada una con un estilo personalizado diferente.
Todavía usa los números, sin embargo, no directamente; ya no toman una forma codificada (como en su código) ahora, sino que se sustituyen con los métodos de longitud combinada () (observe dos estrellas que preceden y agregan el str). longitud () en lugar del número absoluto para eliminar el cambio):
para el primer tamaño de cadena, luego str.length () + 1, str.length () + str2.length () para el segundo tamaño de cadena, y así sucesivamente con todas las subcadenas, en lugar de, por ejemplo, 0,7 u 8,19 y así...
fuente
El uso de una clase auxiliar de Spannable como recursos de cadena de Android se comparte en la parte inferior de la página web. Puede abordar esto creando
CharSquences
y dándoles un estilo.Pero en el ejemplo que nos dan, es solo para texto en negrita, cursiva e incluso para colorear. Necesitaba ajustar varios estilos en a
CharSequence
para configurarlos en aTextView
. Entonces, a esa clase (la llaméCharSequenceStyles
), acabo de agregar esta función.Y en la vista agregué esto.
¡Espero que esto te ayude!
fuente
Spanny hace que SpannableString sea más fácil de usar.
fuente
Como dijo Jon , para mí esta es la mejor solución y no necesita configurar ningún texto en tiempo de ejecución, solo use esta clase personalizada HtmlTextView
y eso es todo, ahora solo ponlo en tu XML
con su cadena de HTML
fuente