Cómo cambiar el estilo de un TextView en tiempo de ejecución

98

Tengo una aplicación de Android en la que, cuando el usuario toca un TextView, me gustaría aplicar un estilo definido.

Pensé en encontrar un textview.setStyle()pero no existe. Lo intenté

textview.setTextAppearance();

Pero no funciona.

Cris
fuente
1
Leí en alguna parte que esto no es posible ... stackoverflow.com/questions/2016249/… . Pero puede establecer algunas propiedades por separado.
Floern
1
¿Probaste: textView.setTextTypeface? developer.android.com/reference/android/widget/…
Jonathan Roth
21
@Falmarri ¿Ha revisado los documentos de la API de TextView? Si es así, quizás puedas decir algo más constructivo.
Fletch

Respuestas:

143

Hice esto creando un nuevo archivo XML de la res/values/style.xmlsiguiente manera:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="boldText">
        <item name="android:textStyle">bold|italic</item>
        <item name="android:textColor">#FFFFFF</item>
    </style>

    <style name="normalText">
        <item name="android:textStyle">normal</item>
        <item name="android:textColor">#C0C0C0</item>
    </style>

</resources>

También tengo entradas en mi archivo "strings.xml" como este:

<color name="highlightedTextViewColor">#000088</color>
<color name="normalTextViewColor">#000044</color>

Luego, en mi código creé un ClickListener para atrapar el evento tap en ese TextView: EDITAR: A partir de API 23, 'setTextAppearance' está en desuso

    myTextView.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view){
                    //highlight the TextView
                    //myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    if (Build.VERSION.SDK_INT < 23) {
       myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    } else {
       myTextView.setTextAppearance(R.style.boldText);
    }
     myTextView.setBackgroundResource(R.color.highlightedTextViewColor);
                }
            });

Para volver a cambiarlo, usaría esto:

if (Build.VERSION.SDK_INT < 23) {
    myTextView.setTextAppearance(getApplicationContext(), R.style.normalText);
} else{
   myTextView.setTextAppearance(R.style.normalText);
}
myTextView.setBackgroundResource(R.color.normalTextViewColor);
Glenn
fuente
2
En realidad, esto no funciona con estilos de sombra. Si desea cambiar la sombra, debe hacerlo de esta manera: lockText.setShadowLayer (20, 4, 4, 0xFFFF0000);
Lukas
3
Para evitar la verificación del SDK, puede usar TextViewCompat.setTextAppearance (myTextView, R.style.myStyle);
Justin Fiedler
90

Como sugirió Jonathan, usando textView.setTextTypefaceWorks, lo usé en una aplicación hace unos segundos.

textView.setTypeface(null, Typeface.BOLD); // Typeface.NORMAL, Typeface.ITALIC etc.
DKDiveDude
fuente
9
Puede utilizar textView.setTypeface (nulo, Typeface.BOLD); textView..setTypeface (nulo, Typeface.ITALIC); textView.setTypeface (nulo, Typeface.BOLD_ITALIC);
peceps
2
textView.setTypeface (null, Typeface.BOLD) es lo que funcionó para mí. Por supuesto, podría usar 1 en su lugar, pero supongo que no es una buena práctica ingresar constantes manualmente. Utilice mejor las variables predefinidas en las bibliotecas.
Pijusn
4
No anime a la gente a usar ints en lugar de constantes
Chris.Jenkins
3
¡Buena! Mi error fue que estaba enviando mi tipografía antigua en el primer parámetro. Entonces funciona cuando cambio NORMAL -> NEGRITA pero no NEGRITA -> NORMAL. ¡No sabía que el primer parámetro podría ser nulo! ¡Ahora me funciona bien!
Felipe
12
TextView tvCompany = (TextView)findViewById(R.layout.tvCompany);
tvCompany.setTypeface(null,Typeface.BOLD);

Lo configura desde el código. Tipografía

Azhar
fuente
4

Programáticamente: tiempo de ejecución

Puede hacerlo mediante programación usando setTypeface ():

textView.setTypeface(null, Typeface.NORMAL);      // for Normal Text
textView.setTypeface(null, Typeface.BOLD);        // for Bold only
textView.setTypeface(null, Typeface.ITALIC);      // for Italic
textView.setTypeface(null, Typeface.BOLD_ITALIC); // for Bold and Italic

XML: tiempo de diseño

También puede establecer en XML:

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"

Espero que esto ayude

Summved

Summved Jain
fuente
2

Descubrí textView.setTypeface(Typeface.DEFAULT_BOLD);que es el método más simple.

sfera
fuente
Esto cambia el tipo de letra. no el estilo especificado por el OP.
HBG
Es cierto, aún así, este era el método más simple, y por lo que recuerdo, el único método en el momento de la publicación. Mientras tanto, no estoy seguro de si se agregó un nuevo método de API que permite cambiar el "estilo" a negrita sin alterar el tipo de letra. Por favor corrígeme si estoy equivocado.
sfera
1

prueba esta línea de código.

textview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);

aquí, obtendrá el tipo de letra actual de esta vista de texto y lo reemplazará con el nuevo tipo de letra. Aquí hay un nuevo tipo de letra, DEFAULT_BOLDpero puede aplicar muchos más.

Md. Sajedul Karim
fuente
prefiere explicar por qué su código resolverá su problema, gracias.
Muhammed Refaat
El OP quiere cambiar el estilo, no el tipo de letra.
HBG
0

Dependiendo del estilo que desee establecer, debe utilizar diferentes métodos. TextAppearance tiene su propio setter, TypeFace tiene su propio setter, background tiene su propio setter, etc.

akohout
fuente