2010-06-21 7 views

Antwort

19

In XML, würde es in etwa so aussehen:

style="?header_background" 

programmatisch, es ist ein wenig komplizierter. In Ihrer Tätigkeit:

private static Theme theme = null; 

protected void onCreate(Bundle savedInstanceState) { 
    ... 
    theme = getTheme(); 
    ... 
} 

public static int getThemeColors(int attr){ 
    TypedValue typedvalueattr = new TypedValue(); 
    theme.resolveAttribute(attr, typedvalueattr, true); 
    return typedvalueattr.resourceId; 
} 

Und wenn Sie ein Attribut des Themas zugreifen möchten, würden Sie so etwas tun:

int outside_background = MyActivity.getThemeColors(R.attr.outside_background); 
setBackgroundColor(getResources().getColor(outside_background)); 

Es ist ein wenig mehr gewunden, aber es Sie gehen ;-)

+1

Dies funktioniert nicht wirklich. typedvalueattr.resourceId ist immer 0. Können Sie ein vollständiges Arbeitsbeispiel angeben? – user123321

+1

Ich wusste, dass es einen Weg geben musste, ohne zu wissen, welches Thema gerade angewendet wurde. Perfekt gearbeitet! – DallinDyer

1

Das oben genannte ist keine gute Möglichkeit, dies aus vielen Gründen zu tun. NullPointerExceptions ist eins.

Unten ist der richtige Weg, dies zu tun.

public final class ThemeUtils { 
    // Prevent instantiation since this is a utility class 
    private ThemeUtils() {} 

    /** 
    * Returns the color value of the style attribute queried. 
    * 
    * <p>The attribute will be queried from the theme returned from {@link Context#getTheme()}.</p> 
    * 
    * @param context the caller's context 
    * @param attribResId the attribute id (i.e. R.attr.some_attribute) 
    * @param defaultValue the value to return if the attribute does not exist 
    * @return the color value for the attribute or defaultValue 
    */ 
    public static int getStyleAttribColorValue(final Context context, final int attribResId, final int defaultValue) { 
     final TypedValue tv = new TypedValue(); 
     final boolean found = context.getTheme().resolveAttribute(attribResId, tv, true); 
     return found ? tv.data : defaultValue; 
    } 
} 

Dann tun zu verwenden, nur:

final int attribColor = ThemeUtils.getStyleAttribColorValue(context, R.attr.some_attr, 0x000000 /* default color */); 

Nur der Kontext stellen Sie sicher, dass Sie in der Aktivität kam passieren. Tun Sie nicht getApplicationContext() oder das zurückgegebene Theme stammt vom Anwendungsobjekt und nicht von der Aktivität.

0

Nach einigen Stunden habe ich endlich eine funktionierende Lösung gefunden, die oben genannten ergaben nur die RessourceId, nicht die Farbe. Sie können dies stattdessen verwenden:

public static int getThemeColor(Context context, int attr) { 
    TypedValue typedValue = new TypedValue(); 
    context.getTheme().resolveAttribute(attr, typedValue, true); 
    TypedArray ta = context.obtainStyledAttributes(typedValue.resourceId, new int[]{attr}); 
    int color = ta.getColor(0, 0); 
    ta.recycle(); 
    return color; 
} 

ändern ta.getColor(0, 0) mit dem, was Sie erhalten möchten, können Sie es mit ta.getDimensionPixelSize(0, 0) beispielsweise ersetzen kann. Wenn Sie einen Fallback-Wert festlegen möchten, ersetzen Sie den zweiten Wert 0 durch den von Ihnen benötigten Wert.

Verwandte Themen