307

Is there a way to set the textStyle attribute of a TextView programmatically? There doesn't appear to be a setTextStyle() method.

To be clear, I am not talking about View / Widget styles! I am talking about the following:

<TextView
  android:id="@+id/my_text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Hello World"
  android:textStyle="bold" />
Tim
  • 41,901
  • 18
  • 127
  • 145
Jake Wilson
  • 88,616
  • 93
  • 252
  • 370
  • 1
    you can reference below link, and lock top 1 answer http://stackoverflow.com/questions/6200533/set-textview-style-bold-or-italic – Tiep Oct 21 '13 at 00:46
  • Please check my [answer here](http://stackoverflow.com/a/40802895/1252158). Hope this will help you – Summved Jain Nov 25 '16 at 10:39

13 Answers13

518
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface is the Attribute textStyle.

As Shankar V added, to preserve the previously set typeface attributes you can use:

textview.setTypeface(textview.getTypeface(), Typeface.BOLD);
Thomas Vos
  • 12,271
  • 5
  • 33
  • 71
Raz
  • 8,918
  • 3
  • 27
  • 40
175

Let's say you have a style called RedHUGEText on your 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>

Just create your TextView as usual in the XML layout/your_layout.xml file, let's say:

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

And in the java code of your Activity you do this:

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

It worked for me! And it applied color, size, gravity, etc. I've used it on handsets and tablets with Android API Levels from 8 to 17 with no problems. Note that as of Android 23, that method has been deprecated. The context argument has been dropped, so the last line would need to be:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

To support all API levels use androidX TextViewCompat

TextViewCompat.setTextAppearance(textViewTitle, R.style.RedHUGEText)

Remember... this is useful only if the style of the text really depends on a condition on your Java logic or you are building the UI "on the fly" with code... if it doesn't, it is better to just do:

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

You can always have it your way!

Ultimo_m
  • 4,724
  • 4
  • 38
  • 60
Oscar Salguero
  • 10,275
  • 5
  • 49
  • 48
  • 5
    This will only set a subset of attributes that can be defined in a ` – karl Mar 06 '14 at 00:31
  • 7
    Seems to require min API 23? – William T. Mallard Jun 28 '17 at 17:18
  • 5
    there are two methods, one for api < 23, and one for api 23+. They appear identical except the one for <23 takes a context argument and the one for 23+ does not. Under the hood, the one for api 23+ calls the method for <23 and uses the member context for the textview. – MrPlow Jun 30 '17 at 15:05
69

Search for setTextAppearance or also setTextTypeface. There is similar question on stackoverflow: How to change a TextView's style at runtime

Community
  • 1
  • 1
peter.bartos
  • 11,855
  • 3
  • 51
  • 62
61

So many way to achieve this task some are below:-

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

or if u want through xml

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"
Rafael Ruiz Muñoz
  • 5,333
  • 6
  • 46
  • 92
duggu
  • 37,851
  • 12
  • 116
  • 113
  • setTextAppearance() is the answer I was after in order to apply a custom style defined in my XML. Thanks. – ashario Apr 08 '18 at 04:26
18

Kotlin Version

To retain current font in addition to text style:

textView.apply {
    setTypeface(typeface, Typeface.NORMAL)
    // or
    setTypeface(typeface, Typeface.BOLD)
    // or
    setTypeface(typeface, Typeface.ITALIC)
    // or
    setTypeface(typeface, Typeface.BOLD_ITALIC)
}
aminography
  • 21,986
  • 13
  • 70
  • 74
9

This question is asked in a lot of places in a lot of different ways. I originally answered it here but I feel it's relevant in this thread as well (since i ended up here when I was searching for an answer).

There is no one line solution to this problem, but this worked for my use case. The problem is, the 'View(context, attrs, defStyle)' constructor does not refer to an actual style, it wants an attribute. So, we will:

  1. Define an attribute
  2. Create a style that you want to use
  3. Apply a style for that attribute on our theme
  4. Create new instances of our view with that attribute

In 'res/values/attrs.xml', define a new attribute:

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

In res/values/styles.xml' I'm going to create the style I want to use on my custom TextView

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

In 'res/values/themes.xml' or 'res/values/styles.xml', modify the theme for your application / activity and add the following style:

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

Finally, in your custom TextView, you can now use the constructor with the attribute and it will receive your style

public class CustomTextView extends TextView {

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

It's worth noting that I repeatedly used customTextView in different variants and different places, but it is in no way required that the name of the view match the style or the attribute or anything. Also, this technique should work with any custom view, not just TextViews.

Community
  • 1
  • 1
Kevin Grant
  • 2,311
  • 23
  • 17
7

Since setTextAppearance(resId) is only available for API 23 and above, use:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

This method is internally implemented as follows:

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
  • 9,687
  • 3
  • 36
  • 48
6

This worked for me

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

or

textview.setTypeface(Typeface.DEFAULT_BOLD);
Ray Hunter
  • 15,137
  • 5
  • 53
  • 51
3

I´ve resolved it with two simple methods.

Follow the explanation.

My existing style declaration:

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

My Android Java code:

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

Regards.

andresmafra
  • 491
  • 7
  • 19
2

You may try this one

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

This Works For Me

msg.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
OR
TextView.setTypeface(msg.getTypeface(),Typeface.NORMAL);

Instead Off

TextView.setTypeface(Typeface.DEFAULT_BOLD);
0

Using data binding and Kotlin

@BindingAdapter("textViewStyle")
fun TextView.bindTextViewStyle(styleResourceId: Int) {
    TextViewCompat.setTextAppearance(this, styleResourceId)
}

XML

 <TextView
   android:layout_width="wrap_content"
   android:text="test text"
   bind:textViewStyle="@{styleResId}" />
MohamedHarmoush
  • 1,033
  • 11
  • 17
0

As mentioned here, this feature is not currently supported.

Zoe
  • 27,060
  • 21
  • 118
  • 148
dcanh121
  • 4,665
  • 11
  • 37
  • 84