Search code examples
androidxmlstyles

How to retrieve style attributes programmatically from styles.xml


Currently I'm using either a WebView or a TextView to show some dynamic data coming from a webservice in one of my apps. If the data contains pure text, it uses the TextView and applies a style from styles.xml. If the data contains HTML (mostly text and images) it uses the WebView.

However, this WebView is unstyled. Therefor it looks a lot different from the usual TextView. I've read that it's possible to style the text in a WebView simply by inserting some HTML directly into the data. This sounds easy enough, but I would like to use the data from my Styles.xml as the values required in this HTML so I won't need to change the colors et cetera on two locations if I change my styles.

So, how would I be able to do this? I've done some extensive searching but I have found no way of actually retrieving the different style attributes from your styles.xml. Am I missing something here or is it really not possible to retrieve these values?

The style I'm trying to get the data from is the following:

<style name="font4">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">14sp</item>
    <item name="android:textColor">#E3691B</item>
    <item name="android:paddingLeft">5dp</item>
    <item name="android:paddingRight">10dp</item>
    <item name="android:layout_marginTop">10dp</item>
    <item name="android:textStyle">bold</item>
</style>

I'm mainly interested in the textSize and textColor.


Solution

  • It is possible to retrieve custom styles from styles.xml programmatically.

    Define some arbitrary style in styles.xml:

    <style name="MyCustomStyle">
        <item name="android:textColor">#efefef</item>
        <item name="android:background">#ffffff</item>
        <item name="android:text">This is my text</item>
    </style>
    

    Now, retrieve the styles like this

    // The attributes you want retrieved
    int[] attrs = {android.R.attr.textColor, android.R.attr.background, android.R.attr.text};
    
    // Parse MyCustomStyle, using Context.obtainStyledAttributes()
    TypedArray ta = obtainStyledAttributes(R.style.MyCustomStyle, attrs);
    
    // Fetch the text from your style like this.     
    String text = ta.getString(2);
    
    // Fetching the colors defined in your style
    int textColor = ta.getColor(0, Color.BLACK);
    int backgroundColor = ta.getColor(1, Color.BLACK);
    
    // Do some logging to see if we have retrieved correct values
    Log.i("Retrieved text:", text);
    Log.i("Retrieved textColor as hex:", Integer.toHexString(textColor));
    Log.i("Retrieved background as hex:", Integer.toHexString(backgroundColor));
    
    // OH, and don't forget to recycle the TypedArray
    ta.recycle()