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" />

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

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!


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


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"

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

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.


5

Cela a fonctionné pour moi

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

ou

textview.setTypeface(Typeface.DEFAULT_BOLD);

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.


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

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

-1

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

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.