2016-06-02 9 views
4

Ich habe Google Design-Support-Bibliothek für Android verwendet. Um Farbe einer Schaltfläche unterscheidet sich von der App Thema einstellen erkläre ich den Knopf in Layout XML-Datei wie folgt:Set buttonColorNormal programmatisch für Android Button mit AppCompat Design-Effekt

<Button 
      style="@style/Widget.AppCompat.Button.Colored" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:theme="@style/MyButton" /> 

Und dann die MyButton in styles.xml definieren als

<style name="MyButton" parent="ThemeOverlay.AppCompat"> 
    <item name="colorButtonNormal">@color/my_color</item> 
</style> 

Dies gibt Ich habe einen Knopf wie in der Design-Support-Bibliothek, mit der Hintergrundfarbe, die mit @color/my_color in meiner colors.xml-Datei definiert ist.

Daher ist es grundsätzlich android:theme zu verwenden, um das colorButtonNormal Attribut zu ändern, um die gewünschte Farbe zu erhalten.

Wie konnte ich das gleiche Ergebnis programmatisch erreichen? Grundsätzlich, wenn ich so etwas wie

myButton.setTheme(R.style.MyButton) 

tun könnte ... dann könnte ich die colorButtonNormal stellen Sie die Ansicht zu erhalten.

Ich kann nicht festgelegt, die es wie

myButton.setBackgroundColor(ContextCompat.getColor(getContext(),R.color.my_color)); 

oder nicht einmal, wie

ColorStateList colorStateList = ContextCompat.getColorStateList(getActivity(), R.color.my_color); 
ViewCompat.setBackgroundTintList(myButton, colorStateList); 

Dies wird die Design-Support-Bibliothek Wirkung der Berührung entfernen.

+0

haben Sie versucht, setBackgroundTintList zu verwenden? – JEY

+0

@JEY Folgte dem Dokument, aber es hat nicht funktioniert. Die Frage wurde als Referenz aktualisiert. – Tejas

+0

Die beste Möglichkeit besteht darin, die Schaltfläche programmgesteuert mit einem dieser Konstruktoren zu erstellen: Button (Kontext, AttributSet, int defStyleAttr) Schaltfläche (Kontext AttributSet int defStyleAttr, int defStyleRes) – JEY

Antwort

0

für Button schrieb ich diese Hilfsmethode:

public static ColorStateList getButtonColorStateList(Context context, int accentColor) { 
    // get darker variant of accentColor for button pressed state 
    float[] colorHSV = new float[3]; 
    Color.colorToHSV(accentColor, colorHSV); 
    colorHSV[2] *= 0.9f; 
    int darkerAccent = Color.HSVToColor(colorHSV); 

    return new ColorStateList(
      new int[][] {{android.R.attr.state_pressed}, {android.R.attr.state_enabled}, {-android.R.attr.state_enabled}}, 
      new int[] { darkerAccent, accentColor, getColor(context, R.color.buttonColorDisabled) }); 
} 

accentColor ist Farbwert für den normalen Zustand aktiviert. Für gepressten Zustand wird dunkler Variante accentColor und zur Sperrzustand habe I definierte Farbe in Werten:

<color name="buttonColorDisabled">#dddddd</color> 

Mit dieser Methode:

mButton.setSupportBackgroundTintList(Utils.getButtonColorStateList(this, accentColor)); 

wo mbutton ist AppCompatButton und accentColor Wert der Farbe ist.

Dies funktioniert für mich auf Lollipop und oben mit Touch-Effekt und auf Vor-Lollipop als Standard Farbwechsel.

+0

@PetrDana. Würde es den Kräuseleffekt entfernen, den wir auf Knopfdruck auf Lollipop und darüber haben? – Tejas

+0

@ Tejas Ripple-Effekt wird beibehalten. –

Verwandte Themen