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.

Cris
la source
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);
Glenn
la source
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.
DKDiveDude
la source
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

Azhar
la source
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é

Jain sommé
la source
2

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

sfera
la source
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.

Md. Sajedul Karim
la source
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.

akohout
la source