web-dev-qa-db-fra.com

Android - définir TextView TextStyle par programme?

Est-il possible de définir par programme l'attribut textStyle d'un TextView? Il ne semble pas y avoir de méthode setTextStyle().

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" />
205
Jake Wilson
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface est l'attribut textStyle.

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

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

Supposons que vous ayez un style appelé RedHUGEText sur votre fichier values ​​/ 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 layout XML/your_layout.xml, par exemple:

<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é, procédez comme suit:

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

Cela a fonctionné 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 Android API Niveaux de 8 à 17 sans aucun problème.

Rappelez-vous ... cela 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 , mieux vaut juste 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!

J'espère que ça aide!

111
Oscar S.

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

60
peter.bartos

Tellement de façons d'accomplir cette tâche que certaines 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);

.

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"
49
duggu

Cette question est posée dans beaucoup d'endroits de différentes manières. J'y ai d'abord répondu ici, mais j'estime que c'est également pertinent dans ce fil (puisque j'ai fini par ici lorsque je cherchais une réponse).

Il n'y a pas de solution en une seule ligne à 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éfinir un attribut
  2. Créez un style que vous souhaitez utiliser
  3. Appliquer un style pour cet attribut sur notre thème
  4. Créer 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 est à noter que j'ai utilisé à plusieurs reprises customTextView dans différentes variantes et à différents endroits, mais il n'est en aucun cas nécessaire que le nom de la vue corresponde au style, à l'attribut ou à quoi que ce soit. En outre, cette technique devrait fonctionner avec n'importe quelle vue personnalisée, pas seulement avec TextViews.

7
Kevin Grant

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

Cela a fonctionné pour moi

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

ou

textview.setTypeface(Typeface.DEFAULT_BOLD);
4
Ray Hunter

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 Android Java:

    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.

2
andresmafra