2011-11-19 3 views
5

Come posso ottenere il valore di un attributo Tema a livello di codice?Ottieni gli attributi del tema a livello di codice

Ad esempio:

Tema:

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

Codice:

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

EDIT: troppe risposte che non affrontano la questione.

+0

Una domanda simile risposta qui: http://stackoverflow.com/questions/7896615/android-how-to-get-value-of-an-attribute-in-code – Oderik

+0

possibile duplicato di [android get runtime textappearance] (http://stackoverflow.com/questions/8983629/android-get -textappearance-runtime) – fho

risposta

6

uso questa funzione:

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

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

Da TextView.java questo è ciò che la funzione di cui sopra fa:

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

Questo è un altro modo di fare questo. Assicurati di riciclare l'aspetto (TypedArray obect). Spero che questo ti aiuti!

+0

off topic, ma quale sarebbe il resid in questo caso? significato come R.attrs.bleh. – user123321

+0

dovrebbe essere R.style.textAppearanceLarge secondo la tua domanda. Altra cosa si potrebbe anche usare direttamente android.R.style.TextAppearance.Large – rDroid

+0

cool. Hai il modo di ottenere il valore int letterale di "R.style.textAppearanceLarge"? Voglio fare alcune cose fantasi con esso. – user123321

1

Questo dovrebbe fare il trucco:

int textAppearance = android.R.attr.textAppearanceLarge; 
myTextView.setTextAppearance(context, textAppearance); 
0

ho finito con il seguente codice: esempio

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

} 

Usage:

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

Il R.styleable.RangeBar_textAppearance è il mio attributo, ma puoi accedere agli attributi di Android thi s modo:

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

so che il metodo è una sorta di hacking, ma non so di qualsiasi altro migliore :(