2015-10-10 15 views
10

Wie kann ich die Textfarbe meiner TextView auf ?android:textColorPrimary programmgesteuert festlegen?Programmgesteuert Textfarbe zu primären Android Textansicht

Ich habe versucht, den Code unten, aber es setzt die Textfarbe immer auf weiß für TextColorPrimary und TextColorPrimaryInverse (Beide sind nicht weiß, ich habe durch XML überprüft).

TypedValue typedValue = new TypedValue(); 
Resources.Theme theme = getActivity().getTheme(); 
theme.resolveAttribute(android.R.attr.textColorPrimaryInverse, typedValue, true); 
int primaryColor = typedValue.data; 

mTextView.setTextColor(primaryColor); 
+0

Normalerweise erweitere ich TextView Klasse und ich benutze es überall in der App. In meinen TextView Klasse I Einstellungen wie Standardfarbe, Schriftart und so weiter. Ein anderer Ansatz besteht darin, eine statische Variable mit der gewünschten Farbe zu erstellen und .setTextColor() zu verwenden; überall. Die dritte Möglichkeit besteht darin, den neuen Android Studio (1.4) Theme-Debugger zum Bearbeiten Ihres Designs zu verwenden. Ich weiß, das ist keine direkte Antwort, aber es könnte eine gute Arbeit sein. –

+0

Ich habe nicht vor, 'setTextColor' überall zu verwenden. Ich möchte die Farbe von sekundär zu primär für eine bestimmte 'TextView' einstellen. – jaibatrik

+0

können Sie versuchen, es als ... zu verwenden. 'MTextView.setTextColor (android.R.attr.textColorPrimary);' –

Antwort

14

Schließlich habe ich den folgenden Code die primäre Textfarbe des Themas zu bekommen -

// Get the primary text color of the theme 
TypedValue typedValue = new TypedValue(); 
Resources.Theme theme = getActivity().getTheme(); 
theme.resolveAttribute(android.R.attr.textColorPrimary, typedValue, true); 
TypedArray arr = 
     getActivity().obtainStyledAttributes(typedValue.data, new int[]{ 
       android.R.attr.textColorPrimary}); 
int primaryColor = arr.getColor(0, -1); 
+5

Vergessen Sie nicht, das TypedArray nach Ihrer letzten Zeile 'arr.recycle()' zu recyceln. – sorianiv

3

Dies ist der richtige Weg, es zu tun.

Der Standardwert textColorPrimary ist keine Farbe, sondern eine ColorStateList. Sie müssen also prüfen, ob das Attribut in eine resourceId oder einen Farbwert aufgelöst wurde.

public static TypedValue resolveThemeAttr(Context context, @AttrRes int attrRes) { 
    Theme theme = context.getTheme(); 
    TypedValue typedValue = new TypedValue(); 
    theme.resolveAttribute(attrRes, typedValue, true); 
    return typedValue; 
} 

@ColorInt public static int resolveColorAttr(Context context, @AttrRes int colorAttr) { 
    TypedValue resolvedAttr = resolveThemeAttr(context, colorAttr); 
    // resourceId is used if it's a ColorStateList, and data if it's a color reference or a hex color 
    int colorRes = resolvedAttr.resourceId != 0 ? resolvedAttr.resourceId : resolvedAttr.data; 
    return ContextCompat.getColor(context, colorRes); 
} 
Verwandte Themen