Vor dem heutigen Update von AppCompat
konnte ich die Farbe der Schaltflächen in Android L ändern, jedoch nicht in älteren Versionen. Nach dem Einfügen des neuen AppCompat-Updates kann ich die Farbe für beide Versionen nicht ändern. Wenn ich es versuche, verschwindet die Schaltfläche einfach. Weiß jemand, wie man die Knopffarbe ändert?
Die folgenden Bilder zeigen, was ich erreichen möchte:
Der weiße Knopf ist Standard, der rote ist das, was ich will.
Dies ist, was ich zuvor getan habe, um die Farbe der Schaltflächen im styles.xml
zu ändern:
<item name="Android:colorButtonNormal">insert color here</item>
und um es dynamisch zu machen:
button.getBackground().setColorFilter(getResources().getColor(insert color here), PorterDuff.Mode.MULTIPLY);
Außerdem habe ich das übergeordnete Thema von @Android:style/Theme.Material.Light.DarkActionBar
in Theme.AppCompat.Light.DarkActionBar
geändert.
Offiziell behoben in Support Library rev.22 (Fr 13. März 2015). Siehe relevantes Google-Code-Problem:
https://issuetracker.google.com/issues/37008632
Anwendungsbeispiel
theme.xml:
<item name="colorButtonNormal">@color/button_color</item>
v21/theme.xml
<item name="Android:colorButtonNormal">@color/button_color</item>
Die Appcompat Bibliothek unterstützt nun Materialknöpfe, nachdem ich die ursprüngliche Antwort gepostet habe. In diesem Beitrag sehen Sie die einfachste Implementierung von erhöhten und flachen Schaltflächen.
Da AppCompat die Schaltfläche noch nicht unterstützt, können Sie XML als Hintergrund verwenden. Dafür habe ich mir den Quellcode des Android angesehen und die zugehörigen Dateien zum Stylen von Materialknöpfen gefunden.
Schauen Sie sich den btn_default_material.xml im Android Quellcode an .
Sie können die Datei in den Ordner drawable-v21 Ihres Projekts kopieren. Berühren Sie hier aber nicht die Farbattration. Die Datei, die Sie ändern müssen, ist die zweite Datei.
drawable-v21/custom_btn.xml
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="?attr/colorControlHighlight">
<item Android:drawable="@drawable/btn_default_mtrl_shape" />
</ripple>
Wie Sie feststellen, gibt es eine Form in diesem Drawable, die Sie in diese Datei des Quellcodes finden.
<inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:insetLeft="@dimen/button_inset_horizontal_material"
Android:insetTop="@dimen/button_inset_vertical_material"
Android:insetRight="@dimen/button_inset_horizontal_material"
Android:insetBottom="@dimen/button_inset_vertical_material">
<shape Android:shape="rectangle">
<corners Android:radius="@dimen/control_corner_material" />
<solid Android:color="?attr/colorButtonNormal" />
<padding Android:left="@dimen/button_padding_horizontal_material"
Android:top="@dimen/button_padding_vertical_material"
Android:right="@dimen/button_padding_horizontal_material"
Android:bottom="@dimen/button_padding_vertical_material" />
</shape>
Und in dieser Datei gibt es einige Dimensionen aus der Datei die Sie hier finden können . Sie können die gesamte Datei kopieren und in den Ordner mit den Werten einfügen. Dies ist wichtig, um allen Schaltflächen dieselbe Größe (die für Materialschaltflächen verwendet wird) zuzuweisen
Für ältere Versionen sollten Sie eine andere Grafik mit demselben Namen haben. Ich setze die Elemente direkt in die Zeile ein, anstatt auf sie zu verweisen. Vielleicht möchten Sie sie referenzieren. Das Wichtigste sind jedoch die ursprünglichen Abmessungen des Materialknopfs.
drawable/custom_btn.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- pressed state -->
<item Android:state_pressed="true">
<inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:insetLeft="@dimen/button_inset_horizontal_material"
Android:insetTop="@dimen/button_inset_vertical_material"
Android:insetRight="@dimen/button_inset_horizontal_material"
Android:insetBottom="@dimen/button_inset_vertical_material">
<shape Android:shape="rectangle">
<corners Android:radius="@dimen/control_corner_material" />
<solid Android:color="@color/PRESSED_STATE_COLOR" />
<padding Android:left="@dimen/button_padding_horizontal_material"
Android:top="@dimen/button_padding_vertical_material"
Android:right="@dimen/button_padding_horizontal_material"
Android:bottom="@dimen/button_padding_vertical_material" />
</shape>
</inset>
</item>
<!-- focused state -->
<item Android:state_focused="true">
<inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:insetLeft="@dimen/button_inset_horizontal_material"
Android:insetTop="@dimen/button_inset_vertical_material"
Android:insetRight="@dimen/button_inset_horizontal_material"
Android:insetBottom="@dimen/button_inset_vertical_material">
<shape Android:shape="rectangle">
<corners Android:radius="@dimen/control_corner_material" />
<solid Android:color="@color/FOCUSED_STATE_COLOR" />
<padding Android:left="@dimen/button_padding_horizontal_material"
Android:top="@dimen/button_padding_vertical_material"
Android:right="@dimen/button_padding_horizontal_material"
Android:bottom="@dimen/button_padding_vertical_material" />
</shape>
</inset>
</item>
<!-- normal state -->
<item>
<inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:insetLeft="@dimen/button_inset_horizontal_material"
Android:insetTop="@dimen/button_inset_vertical_material"
Android:insetRight="@dimen/button_inset_horizontal_material"
Android:insetBottom="@dimen/button_inset_vertical_material">
<shape Android:shape="rectangle">
<corners Android:radius="@dimen/control_corner_material" />
<solid Android:color="@color/NORMAL_STATE_COLOR" />
<padding Android:left="@dimen/button_padding_horizontal_material"
Android:top="@dimen/button_padding_vertical_material"
Android:right="@dimen/button_padding_horizontal_material"
Android:bottom="@dimen/button_padding_vertical_material" />
</shape>
</inset>
</item>
</selector>
Ihre Schaltfläche hat auf Lollipop-Geräten einen Ripple-Effekt. Die alten Versionen haben bis auf den Ripple-Effekt genau dieselbe Schaltfläche. Da Sie jedoch Zeichnungsobjekte für verschiedene Zustände bereitstellen, reagieren diese auch auf Berührungsereignisse (wie auf die alte Art).
Dies wurde in Version 23.0.0 der AppCompat-Bibliothek um weitere Themen erweitert, darunter
Widget.AppCompat.Button.Colored
Schließen Sie zunächst die appCompat-Abhängigkeit ein, falls Sie dies noch nicht getan haben
compile('com.Android.support:appcompat-v7:23.0.0') {
exclude group: 'com.google.Android', module: 'support-v4'
}
da Sie nun Version 23 der App verwenden müssen, müssen Sie auch SDK-Version 23 als Ziel festlegen.
compileSdkVersion = 23
targetSdkVersion = 23
In deinem values/theme
<item name="Android:buttonStyle">@style/BrandButtonStyle</item>
In deinem values/style
<style name="BrandButtonStyle" parent="Widget.AppCompat.Button.Colored">
<item name="colorButtonNormal">@color/yourButtonColor</item>
<item name="Android:textColor">@color/White</item>
</style>
In deinem values-v21/style
<style name="BrandButtonStyle" parent="Widget.AppCompat.Button.Colored">
<item name="Android:colorButtonNormal">@color/yourButtonColor</item>
<item name="Android:textColor">@color/White</item>
</style>
Da Ihr Schaltflächenthema auf Widget.AppCompat.Button.Colored
basiert, ist die Textfarbe auf der Schaltfläche standardmäßig weiß!
es scheint jedoch ein Problem zu bestehen, wenn Sie die Schaltfläche deaktivieren. Die Schaltfläche ändert ihre Farbe in hellgrau, die Textfarbe bleibt jedoch weiß!
eine Problemumgehung besteht darin, die Textfarbe auf der Schaltfläche speziell auf Weiß festzulegen! wie ich es in dem oben gezeigten Stil getan habe.
jetzt können Sie einfach Ihre Schaltfläche definieren und AppCompat den Rest erledigen lassen :)
<Button
Android:layout_width="200dp"
Android:layout_height="48dp" />
Bearbeiten:
<Button Android:theme="@style/BrandButtonStyle"/>
hinzufügen
In der Android Support Library 22.1.0 hat Google die Button
-Farbe kenntlich gemacht. Eine andere Möglichkeit, die Hintergrundfarbe der Schaltfläche anzupassen, ist die Verwendung des Attributs backgroundTint
.
Zum Beispiel,
<Button
Android:id="@+id/add_remove_button"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:backgroundTint="@color/bg_remove_btn_default"
Android:textColor="@Android:color/white"
tools:text="Remove" />
Verwenden Sie zur Unterstützung farbiger Schaltflächen die neueste AppCompat-Bibliothek (> 23.2.1) mit:
aufblasen - XML
AppCompat Widget:
Android.support.v7.widget.AppCompatButton
AppCompat-Stil:
style="@style/Widget.AppCompat.Button.Colored"
ACHTUNG! Um eine benutzerdefinierte Farbe in xml zu setzen: benutze den attr: app
anstelle von Android
(Verwenden Sie alt+enter
oder deklarieren Sie xmlns:app="http://schemas.Android.com/apk/res-auto"
, um app
zu verwenden)
app: backgroundTint = "@ color/your_custom_color"
Beispiel:
<Android.support.v7.widget.AppCompatButton
style="@style/Widget.AppCompat.Button.Colored"
app:backgroundTint="@color/your_custom_color"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Colored Button"/>
oder programmgesteuert einstellen - Java
ViewCompat.setBackgroundTintList(your_colored_button,
ContextCompat.getColorStateList(getContext(),R.color.your_custom_color));
Mit der neuesten Support-Bibliothek können Sie einfach Ihre Aktivität von AppCompatActivity
erben, so dass Ihr Button
als AppCompatButton
aufgeblasen wird und Sie die Möglichkeit haben, die Farben aller einzelnen Schaltflächen im Layout mit zu gestalten von Android:theme="@style/SomeButtonStyle"
, wobei SomeButtonStyle
ist:
<style name="SomeButtonStyle" parent="@Android:style/Widget.Button">
<item name="colorButtonNormal">@color/example_color</item>
</style>
Arbeitete für mich in 2.3.7, 4.4.1, 5.0.2
Die Antwort lautet THEME nicht style
Das Problem ist, dass die Button-Farbe beim colorButtonNormal des Themas bleibt. Ich habe versucht, den Stil auf viele verschiedene Arten zu ändern, ohne Erfolg. Also habe ich das Schaltflächenthema geändert.
Erstellen Sie ein Thema mit colorButtonNormal und colorPrimary:
<style name="ThemeAwesomeButtonColor" parent="AppTheme">
<item name="colorPrimary">@color/awesomePrimaryColor</item>
<item name="colorButtonNormal">@color/awesomeButtonColor</item>
</style>
Verwenden Sie dieses Thema in der Schaltfläche
<Button
Android:id="@+id/btn_awesome"
style="@style/AppTheme.Button"
Android:theme="@style/ThemeAwesomeButtonColor"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="@string/btn_awesome"/>
Der "AppTheme.Button" kann jede beliebige Erweiterung des Button-Stils sein, so wie ich hier die Primärfarbe für die Textfarbe verwende:
<style name="AppTheme.Button" parent="Base.Widget.AppCompat.Button">
...
<item name="Android:textColor">?attr/colorPrimary</item>
...
</style>
Und Sie erhalten den Knopf in jeder gewünschten Farbe, die mit dem Materialdesign kompatibel ist.
Ich habe gerade eine Android Bibliothek erstellt, mit der Sie auf einfache Weise die Tastenfarbe und die Ripple-Farbe ändern können
https://github.com/xgc1986/RippleButton
<com.xgc1986.ripplebutton.widget.RippleButton
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/btn"
Android:text="Android button modified in layout"
Android:textColor="@Android:color/white"
app:buttonColor="@Android:color/black"
app:rippleColor="@Android:color/white"/>
Sie müssen nicht für jede Schaltfläche einen eigenen Stil mit einer anderen Farbe erstellen, damit Sie die Farben nach dem Zufallsprinzip anpassen können
diese arbeit für mich mit appcompat-v7: 22.2.0 in Android + 4.0
in deiner styles.xml
<style name="Button.Tinted" parent="Widget.AppCompat.Button">
<item name="colorButtonNormal">YOUR_TINT_COLOR</item>
<item name="colorControlHighlight">@color/colorAccent</item>
<item name="Android:textColor">@Android:color/white</item>
</style>
in Ihrer Layoutdatei
<Button
Android:id="@+id/but_next"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="@string/but_continue"
Android:theme="@style/Button.Tinted" />
Layout:
<Android.support.v7.widget.AppCompatButton
style="@style/MyButton"
...
/>
styles.xml:
<style name="MyButton" parent="Widget.AppCompat.Button.Colored">
<item name="backgroundTint">@color/button_background_selector</item>
<item name="Android:textColor">@color/button_text_selector</item>
</style>
color/button_background_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_enabled="false" Android:color="#555555"/>
<item Android:color="#00ff00"/>
</selector>
color/button_text_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_enabled="false" Android:color="#888888"/>
<item Android:color="#ffffff"/>
</selector>
Wenn Sie ImageButton
verwenden, gehen Sie wie folgt vor:
In style.xml:
<style name="BlueImageButton" parent="Base.Widget.AppCompat.ImageButton">
<item name="colorButtonNormal">@color/primary</item>
<item name="Android:tint">@color/white</item>
</style>
in v21/style.xml:
<style name="BlueImageButton" parent="Widget.AppCompat.ImageButton">
<item name="Android:colorButtonNormal">@color/primary</item>
<item name="Android:tint">@color/white</item>
</style>
Dann in Ihrer Layoutdatei:
<Android.support.v7.widget.AppCompatImageButton
Android:id="@+id/my_button"
Android:theme="@style/BlueImageButton"
Android:layout_width="42dp"
Android:layout_height="42dp"
Android:layout_gravity="center_vertical"
Android:src="@drawable/ic_check_black_24dp"
/>
Wenn Sie eine Stillösung mit colorButtonNormal verwenden, vergessen Sie nicht, von Widget.AppCompat.Button.Colored die Welligkeit zu erben wirkung funktioniert;)
Mögen
<style name="CustomButtonStyle" parent="Widget.AppCompat.Button.Colored">
<item name="colorButtonNormal">@Android:color/white</item>
</style>
Wenn Sie nur die Materialschaltfläche "Flach" möchten, können Sie deren Hintergrund mit dem Attribut selectableItemBackground anpassen, wie beschrieben hier .
Wenn Sie einen AppCompat-Stil wie Widget.AppCompat.Button, Base.Widget.AppCompat.Button.Colored usw. verwenden möchten, müssen Sie diese Stile mit kompatiblen Ansichten verwenden aus der Support-Bibliothek.
Der folgende Code funktioniert nicht für Pre-Lolipop-Geräte:
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:theme="@style/Widget.AppCompat.Button" />
Sie müssen AppCompatButton verwenden, um AppCompat-Stile zu aktivieren:
<Android.support.v7.widget.AppCompatButton
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:theme="@style/Widget.AppCompat.Button" />
Für mich bestand das Problem darin, dass in Android 5.0 der Android:colorButtonNormal
keine Auswirkung hatte und eigentlich kein Element aus dem Thema (wie Android:colorAccent
), sondern in Android 4.4.3 zum Beispiel. Das Projekt wurde mit compileSdkVersion
und targetSdkVersion
bis 22 konfiguriert, daher habe ich alle Änderungen als @Muhammad Alfaifi sugessted vorgenommen, aber am Ende habe ich bemerkt, dass das Problem das buildToolsVersion , das wurde nicht aktualisiert. Sobald ich zu 23.0.1 gewechselt habe, funktioniert alles fast wie gewohnt. Jetzt hat der Android:colorButtonNormal
noch keine Wirkung, aber zumindest reagiert der Knopf auf Android:colorAccent
, was für mich akzeptabel ist.
Ich hoffe, dass dieser Hinweis jemandem helfen konnte. Hinweis: Ich habe den Stil direkt auf die Schaltfläche angewendet, da der Android:theme=[...]
der Schaltfläche ebenfalls keine Wirkung hatte.
Ich benutze das. Ripple-Effekt und Button-Klick-Schattenfunktion.
style.xml
<style name="Button.Red" parent="Widget.AppCompat.Button.Colored">
<item name="Android:textColor">@color/material_white</item>
<item name="Android:backgroundTint">@color/red</item>
</style>
Schaltfläche im Layout:
<Button
style="@style/Button.Red"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="@string/close"/>
Eine weitere einfache Lösung mit dem AppCompatButton
<Android.support.v7.widget.AppCompatButton
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
style="@style/Widget.AppCompat.Button.Colored"
app:backgroundTint="@color/red"
Android:text="UNINSTALL" />
Verwenden Sie Design Support Library (23.2.0) und AppCompatwidgets wie folgt
In Android Support Library 22.1:
Dies geschieht automatisch beim Aufblasen von Layouts - Ersetzen von Button durch AppCompatButton, TextView durch AppCompatTextView usw., um sicherzustellen, dass jedes Layout das Abtönen unterstützt. In dieser Version sind diese farbbewussten Widgets jetzt öffentlich verfügbar, sodass Sie die Farbunterstützung auch dann beibehalten können, wenn Sie eines der unterstützten Widgets in eine Unterklasse einteilen müssen.
Die vollständige Liste der farbempfindlichen Widgets:
AppCompatAutoCompleteTextView
AppCompatButton
AppCompatCheckBox
AppCompatCheckedTextView
AppCompatEditText
AppCompatMultiAutoCompleteTextView
AppCompatRadioButton
AppCompatRatingBar
AppCompatSpinner
AppCompatTextView
Materialdesign für Pre-Lollipop-Geräte:
AppCompat (auch bekannt als ActionBarCompat) war ursprünglich ein Backport der Android 4.0-ActionBar-API für Geräte, die auf Gingerbread ausgeführt werden. Zusätzlich zur Backport-Implementierung und der Framework-Implementierung wurde eine gemeinsame API-Ebene bereitgestellt. AppCompat v21 bietet eine API und einen Funktionsumfang, die mit Android 5.0 auf dem neuesten Stand sind
Eine Möglichkeit, dies zu erreichen, besteht darin, auf einen Stil zu zeigen und NICHT ALLE Schaltflächen in Ihrer App gleich zu gestalten.
Fügen Sie in themes.xml ein Thema hinzu
<style name="Theme.MyApp.Button.Primary.Blue" parent="Widget.AppCompat.Button">
<item name="colorButtonNormal">@color/someColor</item>
<item name="Android:textColorPrimary">@Android:color/white</item>
</style>
Jetzt in styles.xml hinzufügen
<style name="MyApp.Button.Primary.Blue" parent="">
<item name="Android:theme">@style/Theme.MyApp.Button.Primary.Blue</item>
</style>
Zeigen Sie nun in Ihrem Layout einfach auf den STIL in Ihrem Button
<Button
...
style="@style/MyApp.Button.Primary.Blue"
... />
Eigentlich wollte ich meine benutzerdefinierten Schaltflächenstile nicht ändern, aber leider funktionierten sie nicht mehr.
Meine App hat eine minSdkVersion von 9 und alles hat vorher funktioniert.
Ich weiß nicht warum, aber seit ich das Android entfernt habe: vor dem buttonStyle scheint es wieder zu funktionieren
jetzt = arbeiten:
<item name="buttonStyle">@style/ButtonmyTime</item>
vorher = nur graue Materialknöpfe:
<item name="Android:buttonStyle">@style/ButtonmyTime</item>
Ich habe keinen speziellen Ordner für die neue Android Version, da meine Schaltflächen ziemlich flach sind und in allen Android Versionen gleich aussehen sollten.
Vielleicht kann mir jemand sagen, warum ich das "Android" entfernen musste: Der ImageButton arbeitet immer noch mit "Android:"
<item name="Android:imageButtonStyle">@style/ImageButtonmyTimeGreen</item>
Diese SO Antwort hat mir geholfen, eine Antwort zu finden https://stackoverflow.com/a/30277424/307534
Mit dieser Utility-Methode stelle ich den Hintergrundton einer Schaltfläche ein. Es funktioniert mit Pre-Lollipop-Geräten:
// Set button background tint programmatically so it is compatible with pre-Lollipop devices.
public static void setButtonBackgroundTintAppCompat(Button button, ColorStateList colorStateList){
Drawable d = button.getBackground();
if (button instanceof AppCompatButton) {
// appcompat button replaces tint of its drawable background
((AppCompatButton)button).setSupportBackgroundTintList(colorStateList);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
// Lollipop button replaces tint of its drawable background
// however it is not equal to d.setTintList(c)
button.setBackgroundTintList(colorStateList);
} else {
// this should only happen if
// * manually creating a Button instead of AppCompatButton
// * LayoutInflater did not translate a Button to AppCompatButton
d = DrawableCompat.wrap(d);
DrawableCompat.setTintList(d, colorStateList);
button.setBackgroundDrawable(d);
}
}
Wie im Code zu verwenden:
Utility.setButtonBackgroundTintAppCompat(myButton,
ContextCompat.getColorStateList(mContext, R.color.your_custom_color));
Auf diese Weise müssen Sie keine ColorStateList angeben, wenn Sie nur den Hintergrundfarbton und nichts anderes ändern möchten, aber die hübschen Schaltflächeneffekte beibehalten möchten und was nicht.
verwenden Sie Android: backgroundTint = "@ color/customColor" und geben Sie der Schaltfläche eine benutzerdefinierte Farbe. So einfach ist das.
Ich habe Android:textColor
in meinem Schaltflächenthema auf @null
gesetzt und es hilft.
styles.xml
<style name="Button.Base.Borderless" parent="Widget.AppCompat.Button.Borderless.Colored">
<item name="Android:textColor">@null</item>
</style>
some_layout.xml
<Button
style="@style/Button.Base.Borderless"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/hint" />
Die Textfarbe der Schaltfläche ist jetzt colorAccent
und in AppTheme
definiert.
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="colorAccent">@color/colorAccent</item>
<item name="borderlessButtonStyle">@style/Button.Base.Borderless</item>
<item name="alertDialogTheme">@style/AlertDialog</item>
</style>
So ändern Sie die Farbe einer einzelnen Schaltfläche
ViewCompat.setBackgroundTintList(button, getResources().getColorStateList(R.color.colorId));
Nachdem ich 2 Tage nach Antworten gesucht hatte, funktionierte das Schaltflächentheming in API <21 für mich nicht.
Meine einzige Lösung besteht darin, das AppCompatButton-Tönen nicht nur mit dem Basis-App-Thema "colorButtonNormal", sondern auch mit der Ansicht backgroundTint wie folgt zu überschreiben:
public class AppCompatColorButton extends AppCompatButton {
public AppCompatColorButton(Context context) {
this(context, null);
}
public AppCompatColorButton(Context context, AttributeSet attrs) {
this(context, attrs, Android.support.v7.appcompat.R.attr.buttonStyle);
}
public AppCompatColorButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
if (TintManager.SHOULD_BE_USED) {
setSupportBackgroundTintList(createButtonColorStateList(getContext(), attrs, defStyleAttr));
}
}
static final int[] DISABLED_STATE_SET = new int[]{-Android.R.attr.state_enabled};
static final int[] FOCUSED_STATE_SET = new int[]{Android.R.attr.state_focused};
static final int[] PRESSED_STATE_SET = new int[]{Android.R.attr.state_pressed};
static final int[] EMPTY_STATE_SET = new int[0];
private ColorStateList createButtonColorStateList(Context context, AttributeSet attrs, int defStyleAttr) {
final int[][] states = new int[4][];
final int[] colors = new int[4];
int i = 0;
final int themeColorButtonNormal = ThemeUtils.getThemeAttrColor(context, Android.support.v7.appcompat.R.attr.colorButtonNormal);
/*TypedArray a = context.obtainStyledAttributes(attrs, new int[] { Android.R.attr.backgroundTint }, defStyleAttr, 0);
final int colorButtonNormal = a.getColor(0, themeColorButtonNormal);*/
TypedArray a = context.obtainStyledAttributes(attrs, Android.support.v7.appcompat.R.styleable.View, defStyleAttr, 0);
final int colorButtonNormal = a.getColor(Android.support.v7.appcompat.R.styleable.View_backgroundTint, themeColorButtonNormal);
a.recycle();
final int colorControlHighlight = ThemeUtils.getThemeAttrColor(context, Android.support.v7.appcompat.R.attr.colorControlHighlight);
// Disabled state
states[i] = DISABLED_STATE_SET;
colors[i] = ThemeUtils.getDisabledThemeAttrColor(context, Android.support.v7.appcompat.R.attr.colorButtonNormal);
i++;
states[i] = PRESSED_STATE_SET;
colors[i] = ColorUtils.compositeColors(colorControlHighlight, colorButtonNormal);
i++;
states[i] = FOCUSED_STATE_SET;
colors[i] = ColorUtils.compositeColors(colorControlHighlight, colorButtonNormal);
i++;
// Default enabled state
states[i] = EMPTY_STATE_SET;
colors[i] = colorButtonNormal;
i++;
return new ColorStateList(states, colors);
}
}
Sie können dann Ihre Button-Farbe wie folgt definieren:
<com.example.views.AppCompatColorButton
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:backgroundTint="#ffff0000"
app:backgroundTint="#ffff0000"
Android:text="Button"
Android:textColor="@Android:color/white" />