Android - définir TextView TextStyle par programme?

232

Existe-t-il un moyen de définir l' textStyleattribut d'un par TextViewprogramme? Il ne semble pas y avoir de setTextStyle()méthode.

Pour être clair, je ne parle pas des styles View / Widget! Je parle de ce qui suit:

<TextView
  android:id="@+id/my_text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Hello World"
  android:textStyle="bold" />
Jake Wilson
la source
1
vous pouvez référencer le lien ci-dessous et verrouiller la première réponse stackoverflow.com/questions/6200533/…
Tiep
Veuillez vérifier ma réponse ici . J'espère que cela vous aidera
Summved Jain

Réponses:

410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface est l'attribut textStyle.

Comme l'a ajouté Shankar V , pour conserver les attributs de police définis précédemment, vous pouvez utiliser:

textview.setTypeface(textview.getTypeface(), Typeface.BOLD);
Raz
la source
14
ça devrait êtretextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V
2
@IlyaEremin pour conserver la police précédemment définie, vous devez l'utiliser comme ceci.
Sankar V
Modifié ma réponse sur la base du commentaire @SankarV.
Raz
13
Je pense que vous devriez perdre le DEFAULT: holder.title.setTypeface (holder.title.getTypeface (), Typeface.BOLD);
Iman Akbari
textview.getTypeface().getStyle()Est en faitandroid:textStyle
Pierre
126

Disons que vous avez un style appelé RedHUGEText sur vos valeurs / styles.xml:

<style name="RedHUGEText" parent="@android:style/Widget.TextView">
    <item name="android:textSize">@dimen/text_size_huge</item>
    <item name="android:textColor">@color/red</item>
    <item name="android:textStyle">bold</item>
</style>

Créez simplement votre TextView comme d'habitude dans le fichier XML layout / your_layout.xml, disons:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" />

Et dans le code java de votre activité, vous procédez comme suit:

TextView textViewTitle = (TextView) findViewById(R.id.text_view_title);
textViewTitle.setTextAppearance(this, R.style.RedHUGEText);

Ça a marché pour moi! Et il a appliqué la couleur, la taille, la gravité, etc. Je l'ai utilisé sur des combinés et des tablettes avec des niveaux d'API Android de 8 à 17 sans aucun problème. Notez que depuis Android 23, cette méthode est obsolète. L'argument contextuel a été supprimé, donc la dernière ligne devrait être:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

Rappelez-vous ... ceci n'est utile que si le style du texte dépend vraiment d'une condition de votre logique Java ou si vous construisez l'interface utilisateur "à la volée" avec du code ... si ce n'est pas le cas, il est préférable de simplement faire:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" 
    style="@style/RedHUGEText" />

Vous pouvez toujours l'avoir à votre façon!

Oscar Salguero
la source
4
Cela ne définira qu'un sous-ensemble d'attributs qui peuvent être définis dans une <style>balise. Il fait les plus courants (taille, couleur, style), mais n'en applique pas d'autres (y compris le rembourrage, l'arrière-plan, la gravité, etc.)
Karl
5
Semble exiger min API 23?
William T. Mallard
4
il existe deux méthodes, une pour api <23 et une pour api 23+. Ils semblent identiques sauf que celui de <23 prend un argument de contexte et celui de 23+ ne le fait pas. Sous le capot, celui pour api 23+ appelle la méthode pour <23 et utilise le contexte de membre pour la visualisation de texte.
MrPlow
63

Recherchez setTextAppearanceou aussi setTextTypeface. Il y a une question similaire sur stackoverflow: comment changer le style d'un TextView à l'exécution

peter.bartos
la source
setTextAppearance obsolète api niveau 23
athospy
il existe une nouvelle méthode pour api 23+ qui ne prend tout simplement pas d'argument contextuel.
MrPlow
53

Autant de moyens pour accomplir cette tâche, certains sont ci-dessous:

1.

String text_view_str = "<b>Bolded text</b>, <i>italic text</i>, even <u>underlined</u>!";
TextView tv = (TextView)findViewById(R.id.ur_text_view_id);
tv.setText(Html.fromHtml(text_view_str));

2.

tv.setTypeface(null, Typeface.BOLD);
tv.setTypeface(null, Typeface.ITALIC);
tv.setTypeface(null, Typeface.BOLD_ITALIC);
tv.setTypeface(null, Typeface.NORMAL);

3.

SpannableString spannablecontent=new SpannableString(o.content.toString());
spannablecontent.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 
                         0,spannablecontent.length(), 0);
// set Text here
tt.setText(spannablecontent);

4.

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

 tv.setTextAppearance(getApplicationContext(), R.style.boldText);

ou si vous voulez via xml

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"
duggu
la source
setTextAppearance () est la réponse que j'ai recherchée pour appliquer un style personnalisé défini dans mon XML. Merci.
ashario
À mon avis, c'est la meilleure réponse pour le fil. De nombreuses options pour appeler du code par programmation
Nguyen Minh Hien
9

Kotlin Version

Pour conserver la police actuelle en plus du style de texte:

textView.apply {
    setTypeface(typeface, Typeface.NORMAL)
    // or
    setTypeface(typeface, Typeface.BOLD)
    // or
    setTypeface(typeface, Typeface.ITALIC)
    // or
    setTypeface(typeface, Typeface.BOLD_ITALIC)
}
aminographie
la source
7

Cette question est posée dans de nombreux endroits de différentes manières. J'ai d'abord répondu ici, mais je pense que c'est également pertinent dans ce sujet (puisque je me suis retrouvé ici lorsque je cherchais une réponse).

Il n'y a pas de solution unique à ce problème, mais cela a fonctionné pour mon cas d'utilisation. Le problème est que le constructeur 'View (context, attrs, defStyle)' ne fait pas référence à un style réel, il veut un attribut. Nous allons donc:

  1. Définissez un attribut
  2. Créez un style que vous souhaitez utiliser
  3. Appliquer un style pour cet attribut sur notre thème
  4. Créez de nouvelles instances de notre vue avec cet attribut

Dans 'res / values ​​/ attrs.xml', définissez un nouvel attribut:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="customTextViewStyle" format="reference"/>
    ...
</resources>    

Dans res / values ​​/ styles.xml, je vais créer le style que je veux utiliser sur mon TextView personnalisé

<style name="CustomTextView">
    <item name="android:textSize">18sp</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:paddingLeft">14dp</item>
</style>

Dans 'res / values ​​/ themes.xml' ou 'res / values ​​/ styles.xml', modifiez le thème de votre application / activité et ajoutez le style suivant:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <item name="@attr/customTextViewStyle">@style/CustomTextView</item>
    </style>
    ... 
</resources>

Enfin, dans votre TextView personnalisé, vous pouvez maintenant utiliser le constructeur avec l'attribut et il recevra votre style

public class CustomTextView extends TextView {

    public CustomTextView(Context context) {
       super(context, null, R.attr.customTextView);
    }
}

Il convient de noter que j'ai utilisé à plusieurs reprises customTextView dans différentes variantes et à différents endroits, mais il n'est en aucun cas requis que le nom de la vue corresponde au style ou à l'attribut ou quoi que ce soit. En outre, cette technique devrait fonctionner avec n'importe quelle vue personnalisée, pas seulement avec TextViews.

Kevin Grant
la source
5

Cela a fonctionné pour moi

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

ou

textview.setTypeface(Typeface.DEFAULT_BOLD);
Ray Hunter
la source
2

Je l'ai résolu avec deux méthodes simples.

Suivez l'explication.

Ma déclaration de style existante:

<style name="SearchInfoText">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">24sp</item>
    <item name="android:textColor">@color/Church_Grey</item>
    <item name="android:shadowColor">@color/Shadow_Church</item>
    <item name="android:shadowRadius">3</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
</style>

Mon code Java Android:

    TextView locationName = new TextView(getSupportActivity());
    locationName.setId(IdGenerator.generateViewId());
    locationName.setText(location.getName());
    locationName.setLayoutParams(super.centerHorizontal());
    locationName.setTextSize(24f);
    locationName.setPadding(0, 0, 0, 15);
    locationName.setTextColor(getResources().getColor(R.color.Church_Grey));
    locationName.setShadowLayer(3, 1, 1,  getResources().getColor(R.color.Shadow_Church));

Cordialement.

andresmafra
la source
0

Vous pouvez essayer celui-ci

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                textView.setTextAppearance(R.style.Lato_Bold);
            } else {
                textView.setTextAppearance(getActivity(), R.style.Lato_Bold);
            }
insane_warewolf
la source
0

Étant donné setTextAppearance(resId)que n'est disponible que pour l'API 23 et les versions ultérieures, utilisez:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

Cette méthode est implémentée en interne comme suit:

public static void setTextAppearance(@NonNull TextView textView, @StyleRes int resId) {
    if (Build.VERSION.SDK_INT >= 23) {
        textView.setTextAppearance(resId);
    } else {
        textView.setTextAppearance(textView.getContext(), resId);
    }
}
Rohan Taneja
la source
-1

Comme mentionné ici , cette fonctionnalité n'est actuellement pas prise en charge.

dcanh121
la source