wake-up-neo.net

Färben von Schaltflächen in Android mit Material Design und AppCompat

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:

picture showing desired result

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.

238
mail929

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>
216
WindRider

Bearbeiten (22.06.2016):

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.

Ursprüngliche Antwort:

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.

1 - Sehen Sie sich die ursprüngliche Implementierung der Materialschaltfläche aus der Quelle an.

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>

2 - Holen Sie sich die Form des ursprünglichen Materialknopfes

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>

3 - Abmessungen der Materialschaltfläche abrufen

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

4 - Erstellen Sie eine andere zeichnbare Datei für alte Versionen

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>

Ergebnis

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).

148
eluleci

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" />

Status deaktiviert Disabled state

Aktivierter Status Enabled State

Bearbeiten:

<Button Android:theme="@style/BrandButtonStyle"/> hinzufügen

107

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" />
62
Manabu-GT

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));
40
TouchBoarder

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

25
Artem

wenn Sie unter Stil wollen

enter image description here

fügen Sie diesem Stil Ihre Schaltfläche hinzu

style="@style/Widget.AppCompat.Button.Borderless.Colored"

wenn Sie diesen Stil wollen

enter image description here

fügen Sie den folgenden Code hinzu

style="@style/Widget.AppCompat.Button.Colored"
16
Jinu

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.

13
lonelyboycs

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

4
xgc1986

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" />
4
ingyesid

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>
4
BArtWell

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"
    />
3
Micro

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>
3
didi.yeah

Wenn Sie nur die Materialschaltfläche "Flach" möchten, können Sie deren Hintergrund mit dem Attribut selectableItemBackground anpassen, wie beschrieben hier .

1
kiruwka

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" />
1
farukcankaya

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.

1
Bianca D.

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"/>
1
Mete

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" />
1
Hanzyusuf

AKTUALISIEREN

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


1
Amit Vaghela

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>
0
stefan

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.

0
Micro

verwenden Sie Android: backgroundTint = "@ color/customColor" und geben Sie der Schaltfläche eine benutzerdefinierte Farbe. So einfach ist das.

0
SuKu

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>
0
Denis Rybnikov

So ändern Sie die Farbe einer einzelnen Schaltfläche

ViewCompat.setBackgroundTintList(button, getResources().getColorStateList(R.color.colorId));
0
Jaydeep

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" />
0
Thomas G.