Get theme attributes programmatically

How can I get the value of the Theme attribute programmatically?

For instance:

Subject:

<style name="Theme">
    ... truncated ....
    <item name="textAppearanceLarge">@android:style/TextAppearance.Large</item>
</style>

the code:

int textSize = ???? // how do I get Theme.textAppearanceLarge? 

EDIT: Too many answers that do not address the question.

+5
source share
3 answers

use this function:

myView.setTextAppearance(Context context, int resid)
//Sets the text color, size, style, hint color, and highlight color from the specified TextAppearance resource.

see below: http://developer.android.com/reference/android/widget/TextView.html#setTextAppearance%28android.content.Context,%20int%29

From TextView.java, this is what the above function does:

public void setTextAppearance(Context context, int resid) {
    TypedArray appearance =
        context.obtainStyledAttributes(resid,
                                       com.android.internal.R.styleable.TextAppearance);

    int color;
    ColorStateList colors;
    int ts;

    .
    .
    .
    ts = appearance.getDimensionPixelSize(com.android.internal.R.styleable.
                                          TextAppearance_textSize, 0);
    if (ts != 0) {
        setRawTextSize(ts);
    }

    int typefaceIndex, styleIndex;

    typefaceIndex = appearance.getInt(com.android.internal.R.styleable.
                                      TextAppearance_typeface, -1);
    styleIndex = appearance.getInt(com.android.internal.R.styleable.
                                   TextAppearance_textStyle, -1);

    setTypefaceByIndex(typefaceIndex, styleIndex);
    appearance.recycle();
}

This is another way to do this. Make sure you redesign the look (TypedArray obect). Hope this helps!

+6
source

This should do the trick:

int textAppearance = android.R.attr.textAppearanceLarge;
myTextView.setTextAppearance(context, textAppearance);
+1
source

:

public class TextAppearanceConsts
{
    private static final String LOG_TAG = "TextAppearanceConsts";

    public static final int[] styleable_TextAppearance;
    public static final int styleable_TextAppearance_textColor;
    public static final int styleable_TextAppearance_textSize;
    public static final int styleable_TextAppearance_typeface;
    public static final int styleable_TextAppearance_fontFamily;
    public static final int styleable_TextAppearance_textStyle;

    static {
        // F*ing freaking code
        int ta[] = null, taTc = 0, taTs = 0, taTf = 0, taFf = 0, taTst = 0; 
        try{
            Class<?> clazz = Class.forName("com.android.internal.R$styleable", false, TextAppearanceConsts.class.getClassLoader());
            ta = (int[])clazz.getField("TextAppearance").get(null);
            taTc = getField(clazz, "TextAppearance_textColor");
            taTs = getField(clazz, "TextAppearance_textSize");
            taTf = getField(clazz, "TextAppearance_typeface");
            taFf = getField(clazz, "TextAppearance_fontFamily");
            taTst = getField(clazz, "TextAppearance_textStyle");
        }catch(Exception e){
            Log.e(LOG_TAG, "Failed to load styleable_TextAppearance", e);
        }
        styleable_TextAppearance = ta;
        styleable_TextAppearance_textColor = taTc;
        styleable_TextAppearance_textSize = taTs;
        styleable_TextAppearance_typeface = taTf;
        styleable_TextAppearance_fontFamily = taFf;
        styleable_TextAppearance_textStyle = taTst;
    }

    private static int getField(Class<?> clazz, String fieldName)
    throws IllegalAccessException
    {
        try{
            return clazz.getField(fieldName).getInt(null);
        }catch(NoSuchFieldException nsfe){
            Log.e(LOG_TAG, nsfe.toString());
            return -1;
        }
    }

}

:

TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RangeBar, 0, 0);
TypedArray appearance = null;
int ap = ta.getResourceId(R.styleable.RangeBar_textAppearance, -1);
if (ap != -1) {
    appearance = context.getTheme().obtainStyledAttributes(ap, TextAppearanceConsts.styleable_TextAppearance);
    int n = appearance.getIndexCount();
    for (int i = 0; i < n; i++) {
        int attr = appearance.getIndex(i);

        if (attr == TextAppearanceConsts.styleable_TextAppearance_textColor){
            mTextColor = appearance.getColorStateList(attr);
        } else if (attr == TextAppearanceConsts.styleable_TextAppearance_textSize){
            mTextSize = appearance.getDimensionPixelSize(attr, mTextSize);
        } else if (attr == TextAppearanceConsts.styleable_TextAppearance_typeface){
            mTypefaceIndex = appearance.getInt(attr, -1);
        } else if (attr == TextAppearanceConsts.styleable_TextAppearance_fontFamily){
            mFontFamily = appearance.getString(attr);
        } else if (attr == TextAppearanceConsts.styleable_TextAppearance_textStyle){
            mFontStyleIndex = appearance.getInt(attr, -1);
        } else {
            ....
        }
    }
    appearance.recycle();
}

R.styleable.RangeBar_textAppearance - , Android :

final static String ANDROID_NS = "http://schemas.android.com/apk/res/android";
final int textAppearanceResId = attrs.getAttributeResourceValue(ANDROID_NS, "textAppearance", 0);
....
int ap = ta.getResourceId(textAppearanceResId, -1);

I know that this method is a hacker, but I do not know any other better :(

0
source

All Articles