Comment changer le style d'un TextView au moment de l'exécution


98

J'ai une application Android sur laquelle, lorsque l'utilisateur appuie sur a TextView, je souhaite appliquer un style défini.

J'ai pensé en trouver un textview.setStyle()mais ça n'existe pas. j'ai essayé

textview.setTextAppearance();

mais ça ne marche pas.


1
J'ai lu quelque part que ce n'est pas possible ... stackoverflow.com/questions/2016249/… . Mais vous pouvez définir certaines propriétés séparément.
Floern

1
Avez-vous essayé: textView.setTextTypeface? developer.android.com/reference/android/widget/…
Jonathan Roth

21
@Falmarri Avez-vous parcouru les documents de l'API TextView? Si c'est le cas, vous pourriez peut-être dire quelque chose de plus constructif.
Fletch

Réponses:


143

J'ai fait cela en créant un nouveau fichier XML res/values/style.xmlcomme suit:

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

J'ai également une entrée dans mon fichier "strings.xml" comme ceci:

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

Ensuite, dans mon code, j'ai créé un ClickListener pour intercepter l'événement tap sur ce TextView: EDIT: À partir de l'API 23, 'setTextAppearance' est obsolète

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

Pour le modifier, vous utiliseriez ceci:

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

2
En fait, cela ne fonctionne pas avec les styles d'ombre. Si vous souhaitez changer l'ombre, vous devez le faire de cette façon: lockText.setShadowLayer (20, 4, 4, 0xFFFF0000);
Lukas

3
Pour éviter la vérification du SDK, vous pouvez utiliser TextViewCompat.setTextAppearance (myTextView, R.style.myStyle);
Justin Fiedler

90

Comme Jonathan l'a suggéré, en utilisant des textView.setTextTypefaceœuvres, je l'ai juste utilisée dans une application il y a quelques secondes.

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

9
Vous pouvez utiliser textView.setTypeface (null, Typeface.BOLD); textView..setTypeface (null, Typeface.ITALIC); textView.setTypeface (null, Typeface.BOLD_ITALIC);
peceps

2
textView.setTypeface (null, Typeface.BOLD) est ce qui a fonctionné pour moi. Bien sûr, vous pouvez utiliser 1 à la place, mais je suppose que ce n'est pas une bonne pratique d'entrer des constantes manuellement. Mieux vaut utiliser des variables prédéfinies dans les bibliothèques.
Pijusn

4
N'encouragez pas les gens à utiliser des ints au lieu des constantes
Chris.Jenkins

3
Bon! Mon erreur était que j'envoyais mon ancienne police de caractères en premier paramètre. Donc ça marche quand je change NORMAL -> BOLD mais pas BOLD -> NORMAL. Je ne savais pas que le premier paramètre pouvait être nul! Maintenant ça marche bien pour moi!
Felipe

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

Vous le définissez à partir du code. Police de caractères


4

Programmation: temps d'exécution

Vous pouvez le faire par programme en utilisant 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: temps de conception

Vous pouvez également définir en XML:

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

J'espère que cela aidera

Résumé


2

J'ai trouvé textView.setTypeface(Typeface.DEFAULT_BOLD);la méthode la plus simple.


Cela change la police de caractères. pas le style spécifié par l'OP.
HBG

Certes, c'était toujours la méthode la plus simple - et pour autant que je me souvienne la seule méthode - au moment de la publication. Je ne sais pas si une nouvelle méthode API a été ajoutée entre-temps, ce qui permet de changer le "style" en gras sans modifier la police. Corrigez-moi si j'ai tort, s'il-vous plait.
sfera

1

essayez cette ligne de code.

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

ici, il obtiendra la police actuelle de cette vue de texte et la remplacera en utilisant une nouvelle police. La nouvelle police est ici, DEFAULT_BOLDmais vous pouvez en appliquer beaucoup plus.


vous préférez expliquer pourquoi votre code résoudra son problème, merci.
Muhammed Refaat

L'OP veut changer le style, pas la police.
HBG


0

Selon le style que vous souhaitez définir, vous devez utiliser différentes méthodes. TextAppearance a son propre setter, TypeFace a son propre setter, background a son propre setter, etc.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.