Come modificare lo stile di un TextView in fase di esecuzione


98

Ho un'app Android su cui, quando l'utente tocca a TextView, vorrei applicare uno stile definito.

Ho pensato di trovarne uno textview.setStyle()ma non esiste. Provai

textview.setTextAppearance();

ma non funziona.


1
Ho letto da qualche parte che questo non è possibile ... stackoverflow.com/questions/2016249/… . Ma puoi impostare alcune proprietà separatamente.
Floern

1
Hai provato: textView.setTextTypeface? developer.android.com/reference/android/widget/…
Jonathan Roth

21
@Falmarri Hai controllato i documenti api di TextView? Se è così, forse potresti dire qualcosa di più costruttivo.
Fletch

Risposte:


143

L'ho fatto creando un nuovo file XML res/values/style.xmlcome segue:

<?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>

Ho anche una voce nel mio file "strings.xml" come questa:

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

Quindi, nel mio codice ho creato un ClickListener per intercettare l'evento tap su quel TextView: EDIT: As from API 23 'setTextAppearance' is deprecated

    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);
                }
            });

Per cambiarlo di nuovo, dovresti usare questo:

if (Build.VERSION.SDK_INT < 23) {
    myTextView.setTextAppearance(getApplicationContext(), R.style.normalText);
} else{
   myTextView.setTextAppearance(R.style.normalText);
}
myTextView.setBackgroundResource(R.color.normalTextViewColor);

2
In realtà questo non funziona con gli stili di ombreggiatura. Se vuoi cambiare l'ombra devi farlo in questo modo: lockText.setShadowLayer (20, 4, 4, 0xFFFF0000);
Lukas

3
Per evitare il controllo dell'SDK è possibile utilizzare TextViewCompat.setTextAppearance (myTextView, R.style.myStyle);
Justin Fiedler,

90

Come suggerito da Jonathan, usando textView.setTextTypefaceWorks, l'ho usato in un'app solo pochi secondi fa.

textView.setTypeface(null, Typeface.BOLD); // Typeface.NORMAL, Typeface.ITALIC etc.

9
Puoi usare textView.setTypeface (null, Typeface.BOLD); textView..setTypeface (null, Typeface.ITALIC); textView.setTypeface (null, Typeface.BOLD_ITALIC);
peceps

2
textView.setTypeface (null, Typeface.BOLD) è ciò che ha funzionato per me. Ovviamente potresti usare 1 invece, ma immagino che non sia una buona pratica inserire le costanti manualmente. Utilizzare meglio le variabili predefinite nelle librerie.
Pijusn

4
Non incoraggiare le persone a usare gli int invece delle costanti
Chris.Jenkins

3
Buono! Il mio errore è stato quello di inviare il mio vecchio carattere tipografico nel primo parametro. Quindi funziona quando cambio NORMALE -> GRASSETTO ma non GRASSETTO -> NORMALE. Non sapevo che il primo parametro potesse essere nullo! Ora funziona bene per me!
Felipe

12
TextView tvCompany = (TextView)findViewById(R.layout.tvCompany);
tvCompany.setTypeface(null,Typeface.BOLD);

Lo hai impostato dal codice. Carattere tipografico


4

A livello di codice: tempo di esecuzione

Puoi farlo in modo programmatico 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: Design Time

Puoi impostare anche in XML:

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

Spero che questo ti aiuti

Summved


2

ho scoperto textView.setTypeface(Typeface.DEFAULT_BOLD);che è il metodo più semplice.


Questo cambia il carattere tipografico. non lo stile come specificato dall'OP.
HBG

È vero, ancora questo era il metodo più semplice - e per quanto ricordo l'unico metodo - al momento del post. Non sono sicuro se nel frattempo è stato aggiunto un nuovo metodo API che consente di cambiare lo "stile" in grassetto senza alterare il carattere tipografico. Per favore correggimi se sbaglio.
sfera

1

prova questa riga di codice.

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

qui, otterrà il carattere tipografico corrente da questa visualizzazione di testo e lo sostituirà usando il nuovo carattere tipografico. Il nuovo carattere tipografico qui è DEFAULT_BOLDma puoi applicarne molti altri.


preferiresti spiegare perché il tuo codice risolverà il suo problema, grazie.
Muhammed Refaat

L'OP vuole cambiare lo stile, non il carattere tipografico.
HBG


0

A seconda dello stile che desideri impostare, devi utilizzare metodi diversi. L'oggetto TextAppearance ha il suo setter, TypeFace ha il suo setter, lo sfondo ha il suo setter, ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.