2015-09-07 14 views
9

Ich habe ein einfaches TextInputLayout, das eine EditText-Ansicht enthält.Ändern von TextInputLayout Akzentfarbe programmgesteuert

Jetzt frage ich mich, wie die Akzentfarbe (Unterstreichung, HinweisTextColor, wenn hervorgehoben) programmgesteuert ändern. Ich kann nicht scheinen, eine geeignete Methode in TextInputLayout zu finden.

Irgendwelche Vorschläge? Danke im Voraus.

Antwort

3

Sie können dies für den Text versuchen,

InputTextLayout.getEditText().setHighlightColor(yourColor); 
InputTextLayout.getEditText().setHintTextColor(yourColor); 

und dies für die Zeile am unteren Rand des EditText

Drawable background = InputTextLayout.getEditText().getBackground(); 
DrawableCompat.setTint(background, yourColor); 
InputTextLayout.getEditText().setBackground(background); 

Hoffe, es funktioniert!

+1

Nein, es funktioniert nicht! – sud007

+2

@ sud007 Ich versuche das auch und ich bestätigte, dass das nicht funktioniert. Du kannst meine Lösung (meine Antwort in dieser Frage) ausprobieren, die für mich funktioniert. –

15

IMHO InputTextLayout kann Beschriftungsfarbe programmgesteuert nicht ändern, da es nach Stil festgelegt ist. Ich untersuchte Quellcode InputTextLayout und schrieb diese Hack Hilfsmethode, die den Zugang zu privatem Farbelement zu erstellen:

public static void setInputTextLayoutColor(EditText editText, @ColorInt int color) { 
    TextInputLayout til = (TextInputLayout) editText.getParent(); 
    try { 
     Field fDefaultTextColor = TextInputLayout.class.getDeclaredField("mDefaultTextColor"); 
     fDefaultTextColor.setAccessible(true); 
     fDefaultTextColor.set(til, new ColorStateList(new int[][]{{0}}, new int[]{ color })); 

     Field fFocusedTextColor = TextInputLayout.class.getDeclaredField("mFocusedTextColor"); 
     fFocusedTextColor.setAccessible(true); 
     fFocusedTextColor.set(til, new ColorStateList(new int[][]{{0}}, new int[]{ color })); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

mFocusedTextColor für eingestellte interne CollapsingTextHelper.mCollapsedTextColor verwendet wird, die Farbe des Etiketts setzt.

+0

Das funktioniert gut! – sud007

+0

Danke .. das hilft uns viel –

+1

Kann bestätigen, ich habe die Quelle angeschaut und sie verwenden Stile und Attribute, so dass Sie es nicht programmatisch tun können. Dieser reflexionsbasierte Ansatz ist Ihre beste Option. Eine andere Option wäre, die Klasse zu kopieren und Hilfsmethoden hinzuzufügen, um die Farben programmatisch einzustellen. – ashishduh

Verwandte Themen