Set style for TextView programmatically

AndroidTextviewAndroid Styles

Android Problem Overview


I'm trying to use the TextView constructor with style like this:

TextView myText = new TextView(MyActivity.this, null, R.style.my_style);

However, when I do this, the text view does not appear to take the style (I verified the style by setting it on a static object).

I've also tried using myText.setTextAppearance(MyActivity.this, R.style.my_style) but it also doesn't work.

Android Solutions


Solution 1 - Android

I do not believe you can set the style programatically. To get around this you can create a template layout xml file with the style assigned, for example in res/layout create tvtemplate.xml as with the following content:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
	   	android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:text="This is a template"
		style="@style/my_style" />

then inflate this to instantiate your new TextView:

TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null);

Solution 2 - Android

You can create a generic style and re-use it on multiple textviews like the one below:

textView.setTextAppearance(this, R.style.MyTextStyle);

Edit: this refers to Context

Solution 3 - Android

You can pass a [ContextThemeWrapper][1] to the constructor like this:

TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));

[1]: http://developer.android.com/reference/android/view/ContextThemeWrapper.html "ContextThemeWrapper"

Solution 4 - Android

You can set the style in the constructor (but styles can not be dynamically changed/set).

View(Context, AttributeSet, int) (the int is an attribute in the current theme that contains a reference to a style)

Answer from Romain Guy

reference

Solution 5 - Android

Parameter int defStyleAttr does not specifies the style. From the Android documentation:

> defStyleAttr - An attribute in the current theme that contains a > reference to a style resource that supplies default values for the > view. Can be 0 to not look for defaults.

To setup the style in View constructor we have 2 possible solutions:

  1. With use of ContextThemeWrapper:

     ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
     TextView textView = new TextView(wrappedContext, null, 0);
    
  2. With four-argument constructor (available starting from LOLLIPOP):

     TextView textView = new TextView(yourContext, null, 0, R.style.your_style);
    

Key thing for both solutions - defStyleAttr parameter should be 0 to apply our style to the view.

Solution 6 - Android

Dynamically changing styles is not supported (yet). You have to set the style before the view gets created, via XML.

Solution 7 - Android

The accepted answer was great solution for me. The only thing to add is about inflate() method.

In accepted answer all android:layout_* parameters will not be applied.

The reason is no way to adjust it, cause null was passed as ViewGroup parent.

You can use it like this:

View view = inflater.inflate(R.layout.view, parent, false);

and the parent is the ViewGroup, from where you like to adjust android:layout_*.

In this case, all relative properties will be set.

Hope it'll be useful for someone.

Solution 8 - Android

When using custom views that may use style inheritance (or event styleable attributes), you have to modify the second constructor in order not to lose the style. This worked for me, without needing to use setTextAppearence():

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs, attrs.getStyleAttribute());
}

Solution 9 - Android

I met the problem too, and I found the way to set style programatically. Maybe you all need it, So I update there.

The third param of View constructor accepts a type of attr in your theme as the source code below:

public TextView(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.textViewStyle);
}

So you must pass a type of R.attr.** rather than R.style.**

In my codes, I did following steps:

First, customize a customized attr to be used by themes in attr.xml.

<attr name="radio_button_style" format="reference" />

Second, specific your style in your used theme in style.xml.

 <style name="AppTheme" parent="android:Theme.Translucent">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="radio_button_style">@style/radioButtonStyle</item>
</style>
<style name="radioButtonStyle" parent="@android:style/Widget.CompoundButton.RadioButton">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">64dp</item>
    <item name="android:background">#000</item>
    <item name="android:button">@null</item>
    <item name="android:gravity">center</item>
    <item name="android:saveEnabled">false</item>
    <item name="android:textColor">@drawable/option_text_color</item>
    <item name="android:textSize">9sp</item>
</style>

At the end, use it!

            RadioButton radioButton = new RadioButton(mContext, null, R.attr.radio_button_style);

the view created programatically will use the specified style in your theme.

You can have a try, and hope it can work for you perfectly.

Solution 10 - Android

We can use TextViewCompact.setTextAppearance(textView, R.style.xyz).

Android doc for reference.

Solution 11 - Android

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
    textView.setTextAppearance(R.style.yourStyle)

Solution 12 - Android

I have only tested with EditText but you can use the method

> public void setBackgroundResource (int resid)

to apply a style defined in an XML file.

Sine this method belongs to View I believe it will work with any UI element.

regards.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBenView Question on Stackoverflow
Solution 1 - AndroidDan KilpatrickView Answer on Stackoverflow
Solution 2 - AndroidShahul3DView Answer on Stackoverflow
Solution 3 - AndroidmaxcannaView Answer on Stackoverflow
Solution 4 - AndroidDandre AllisonView Answer on Stackoverflow
Solution 5 - AndroidDmitryArcView Answer on Stackoverflow
Solution 6 - AndroidChris CashwellView Answer on Stackoverflow
Solution 7 - AndroidAnorView Answer on Stackoverflow
Solution 8 - AndroidsaiyancoderView Answer on Stackoverflow
Solution 9 - AndroidmrtwoView Answer on Stackoverflow
Solution 10 - AndroidKshitij JainView Answer on Stackoverflow
Solution 11 - AndroidBraian CoronelView Answer on Stackoverflow
Solution 12 - AndroidfloydaddictView Answer on Stackoverflow