Palabras en negrita en una cadena de strings.xml en Android


114

Tengo un texto largo en una de las cadenas en strings.xml. Quiero poner en negrita y cambiar el color de algunas palabras en ese texto.

¿Cómo puedo hacerlo?


¿Puede ser un poco más específico en términos de lo que está tratando de lograr en general?
— Brian

Respuestas:


192

Básicamente, podría usar etiquetas html en su recurso de cadena como:

<resource>
    <string name="styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
</resources>

Y use Html.fromHtml o use spannable, verifique el enlace que publiqué.

Antigua pregunta similar: ¿es posible tener varios estilos dentro de un TextView?


16
Además, dependiendo de cómo use su cadena de recursos, es posible que deba colocar las etiquetas en negrita / cursiva en un bloque CDATA para que no se analicen hasta que las use Html.fromHtml(): ... <![CDATA[<b><i>so</i></b>]]>...
— dule

133
Para cualquier otra persona que haya encontrado la documentación oficial de Android un poco vaga en esto: si usa etiquetas como <b> en su recurso de cadena, asegúrese de recuperarlo usando en getText(R.string.whatever)lugar degetString(R.string.whatever)
— andygeers

1
¿No se supone que sea en namelugar de id?
— Hendra Anggrian

4
Entonces no hay necesidad de Html.fromHtmlo Spannable. Solo usa getText(R.string.whatever)como @andygeers mencionado.
— Alaa M.

1
@andygeers ¿Qué podemos hacer con una cadena como "Mi nombre es <b>% s </b>" que no puede usar getText ya que solo acepta un único parámetro?
— Taylor

45

Use la etiqueta html dentro de los recursos de cadena: -

<resources>
<string name="string_resource_name"><![CDATA[<b> Your text </b>]]> </string>
</resources>

Y obtenga texto en negrita de recursos de cadena como: -

private Spanned getSpannedText(String text) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return Html.fromHtml(text, Html.FROM_HTML_MODE_COMPACT);
        } else {
            return Html.fromHtml(text);
        }
    }


 String s = format(context.getResources().getString(R.string.string_resource_name));
 textView.setText(getSpannedText(s));

es la mejor respuesta y funciona totalmente para las personas que usan @BindingAdapter. Gracias hermano.
— Sup.Ia

44

Como ha dicho David Olsson, puede usar HTML en sus recursos de cadena:

<resource>
    <string name="my_string">A string with <i>actual</i> <b>formatting</b>!</string>
</resources>

Luego, si usa en getText(R.string.my_string)lugar de getString(R.string.my_string), obtiene un en CharSequencelugar de un Stringque contiene el formato incrustado.


getText devuelve CharSequence no un Spannable
— Tigran Babajanyan

1
¿Qué pasa si su cadena es una cantidad a la que necesita agregar un número?
— Taylor

getText no le permite usar marcadores de posición
— Vincent_Paing

10

En kotlin, puede crear funciones de extensiones en recursos (actividades | fragmentos | contexto) que convertirán su cadena en un intervalo html

p.ej

fun Resources.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Resources.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Resources.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = getQuantityString(id, quantity).toHtmlSpan()

fun Resources.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = getQuantityString(id, quantity, *formatArgs).toHtmlSpan()

fun String.toHtmlSpan(): Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
    Html.fromHtml(this)
}

Uso

//your strings.xml
<string name="greeting"><![CDATA[<b>Hello %s!</b><br>]]>This is newline</string>

//in your fragment or activity
resources.getHtmlSpannedString(R.string.greeting, "World")

EDITA aún más extensiones

fun Context.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Context.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Context.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Context.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()


fun Activity.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Activity.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Activity.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Activity.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()


fun Fragment.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Fragment.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Fragment.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Fragment.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()

@Himanshu Mori algún fragmento ayudaría. ¿Lo estás usando en la clase de kotlin?
— svkaka

1
Las extensiones de actividad no son necesarias, la actividad es el contexto en sí mismo
— Farshad Tahmasbi

2

Strings.xml

<string name="my_text"><Data><![CDATA[<b>Well Done !</b><br></br>All of your activities are completed.<br></br>You may now close the app.<br></br>See you again next time.]]></Data></string>

Para configurar

textView.setText(Html.fromHtml(getString(R.string.activity_completed_text)));

1

Puedes hacerlo desde cuerda

 <resources xmlns:tools="http://schemas.android.com/tools">

 <string name="total_review"><b>Total Review: </b> </string>

 </resources>

y puede acceder a él desde el código java como

proDuctReviewNumber.setText(getResources().getString(R.string.total_review)+productDetailsSuccess.getProductTotalReview());

1

strings.xml

<string name="sentence">This price is <b>%1$s</b> USD</string>

page.java

String successMessage = getString(R.string.message,"5.21");

Este precio 5.21 USD


1
Debe utilizar la funcionalidad nativa para pasar parámetros. Simplemente coloque "% 1 $ s" en lugar de "{1}" y llame a getString (R.string.message, "5.21") sin reemplazar ()
— Adrian Grygutis

Los documentos admiten esta respuesta: developer.android.com/guide/topics/resources/… Aunque debe pasar a través de un analizador HTML
— ProjectDelta
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.