Bevor das AppCompat
Update heute veröffentlicht wurde, 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 Tastenfarbe ändert?
Die folgenden Bilder zeigen, was ich erreichen möchte:
Die weiße Taste ist die Standardeinstellung, die rote ist das, was ich will.
Dies ist, was ich zuvor getan habe, um die Farbe der Schaltflächen in styles.xml
:
<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
auf geändertTheme.AppCompat.Light.DarkActionBar
Antworten:
Offiziell festgelegt in der Support Library Rev. 22 (Fr 13. März 2015). Siehe relevantes Google Code-Problem:
https://issuetracker.google.com/issues/37008632
Anwendungsbeispiel
theme.xml:
v21 / theme.xml
quelle
android:theme="@style/ColoredButton"
und in styles.xml<style name="ColoredButton" parent="Widget.AppCompat.Button"> <item name="colorButtonNormal">@color/button_yellow</item> </style>
Bearbeiten (22.06.2016):
Die Appcompat- Bibliothek begann, Materialschaltflächen zu unterstützen, nachdem ich die ursprüngliche Antwort veröffentlicht hatte. In diesem Beitrag 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. Dazu habe ich mir den Quellcode von Android angesehen und die zugehörigen Dateien für das Styling von Materialschaltflächen gefunden.
1 - Sehen Sie sich die ursprüngliche Implementierung der Materialschaltfläche aus der Quelle an.
Schauen Sie sich die 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 jedoch nicht den Farbattr. Die Datei, die Sie ändern müssen, ist die zweite Datei.
drawable-v21 / custom_btn.xml
2 - Erhalten Sie die Form des Originalmaterialknopfes
Wie Sie feststellen, wird in diesem Zeichenbild eine Form verwendet, die Sie in dieser Datei des Quellcodes finden .
3 - Abmessungen der Materialschaltfläche abrufen
Und in dieser Datei gibt es einige Dimensionen, die aus der Datei verwendet werden , die Sie hier finden . Sie können die gesamte Datei kopieren und in Ihren Werteordner ablegen. Dies ist wichtig, um allen Schaltflächen dieselbe Größe (die in Materialschaltflächen verwendet wird) zuzuweisen
4 - Erstellen Sie eine weitere zeichnbare Datei für alte Versionen
Für ältere Versionen sollten Sie eine andere Zeichnung mit demselben Namen haben. Ich setze die Elemente direkt inline, anstatt sie zu referenzieren. Vielleicht möchten Sie sie referenzieren. Aber auch hier sind die ursprünglichen Abmessungen des Materialknopfs das Wichtigste.
drawable / custom_btn.xml
Ergebnis
Ihre Taste hat auf Lollipop-Geräten einen Welleneffekt. Die alten Versionen haben bis auf den Ripple-Effekt genau die gleiche Schaltfläche. Da Sie jedoch Drawables für verschiedene Zustände bereitstellen, reagieren diese auch auf Berührungsereignisse (wie bisher).
quelle
Dies wurde in Version 23.0.0 der AppCompat-Bibliothek um weitere Themen erweitert
Schließen Sie zunächst die appCompat-Abhängigkeit ein, falls Sie dies noch nicht getan haben
Jetzt, da Sie v23 der App-Kompatibilität verwenden müssen, müssen Sie auch auf SDK-v23 abzielen!
In deinem
values/theme
In deinem
values/style
In deinem
values-v21/style
Da basiert dein Button-Thema auf
Widget.AppCompat.Button.Colored
Die Textfarbe auf der Schaltfläche ist standardmäßig weiß!Es scheint jedoch ein Problem zu geben, wenn Sie die Schaltfläche deaktivieren. Die Schaltfläche ändert ihre Farbe in hellgrau, aber die Textfarbe bleibt weiß!
Eine Problemumgehung besteht darin, die Textfarbe auf der Schaltfläche speziell auf Weiß einzustellen! 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 :)
Deaktivierter Zustand
Aktivierter Status
Bearbeiten:
Hinzufügen
<Button android:theme="@style/BrandButtonStyle"/>
quelle
<Button android:theme="@style/BrandButtonStyle"/>
. Es muss dastheme
Attribut sein und nicht dasstyle
Attribut.In der Android Support Library 22.1.0 machte Google den
Button
Farbton bekannt. Eine andere Möglichkeit, die Hintergrundfarbe der Schaltfläche anzupassen, besteht darin, dasbackgroundTint
Attribut zu verwenden.Beispielsweise,
quelle
Verwenden Sie zur Unterstützung farbiger Schaltflächen die neueste AppCompat-Bibliothek (> 23.2.1 ) mit:
AppCompat Widget:
AppCompat-Stil:
NB! So legen Sie eine benutzerdefinierte Farbe in XML fest: Verwenden Sie
app
statt attr :.android
(verwenden
alt+enter
oder deklarierenxmlns:app="http://schemas.android.com/apk/res-auto"
zu verwendenapp
)App : backgroundTint = "@ color / your_custom_color"
Beispiel:
quelle
Mit neuesten Support - Bibliothek können Sie nur erben Sie Aktivität von
AppCompatActivity
, so wird es Ihr aufblasenButton
wieAppCompatButton
und geben Ihnen die Möglichkeit, Stil Farbe jeder einzelnen Taste auf der Anlage mit der Verwendung vonandroid:theme="@style/SomeButtonStyle"
, woSomeButtonStyle
ist:Arbeitete für mich in 2.3.7, 4.4.1, 5.0.2
quelle
android:theme
und nichtstyle
. Sie können auch hinzufügencolorControlHighlight
undcolorControlActivated
.Theme.AppCompat.Light
stattdessen zu verwenden .wenn Sie unter Stil wollen
Fügen Sie diesen Stil Ihrer Schaltfläche hinzu
wenn du diesen Stil willst
Fügen Sie den folgenden Code hinzu
quelle
compile 'com.android.support:appcompat-v7:23.1.0'
Sie müssen hinzufügen.Die Antwort ist in THEMA nicht Stil
Das Problem ist, dass die Button-Farbe dem colorButtonNormal des Themas entspricht. Ich habe versucht, den Stil auf viele verschiedene Arten zu ändern, ohne Glück. Also habe ich das Button-Thema geändert .
Erstellen Sie ein Thema mit colorButtonNormal und colorPrimary:
Verwenden Sie dieses Thema in der Schaltfläche
Der "AppTheme.Button" kann beliebig erweitert werden. Button-Stil wie hier Ich verwende Primärfarbe für Textfarbe:
Und Sie erhalten den Knopf in jeder gewünschten Farbe, die mit dem Materialdesign kompatibel ist.
quelle
Ich habe gerade eine Android-Bibliothek erstellt, mit der Sie die Tastenfarbe und die Welligkeitsfarbe einfach ändern können
https://github.com/xgc1986/RippleButton
Sie müssen nicht für jede gewünschte Schaltfläche einen Stil mit einer anderen Farbe erstellen, sodass Sie die Farben nach dem Zufallsprinzip anpassen können
quelle
Diese Arbeit für mich mit Appcompat-v7: 22.2.0 in Android + 4.0
in Ihrer styles.xml
in Ihrer Layoutdatei
quelle
Layout:
styles.xml:
color / button_background_selector.xml:
color / button_text_selector.xml:
quelle
Für diejenigen, die eine
ImageButton
hier verwenden, ist, wie Sie es tun:In style.xml:
in v21 / style.xml:
Dann in Ihrer Layoutdatei:
quelle
Wenn Sie eine Style-Lösung mit colorButtonNormal verwenden , vergessen Sie nicht, von Widget.AppCompat.Button.Colored zu erben damit der Ripple-Effekt funktioniert;)
Mögen
quelle
Eine weitere einfache Lösung mit dem AppCompatButton
quelle
Verwenden:
Oder auch :
und das gibt der Schaltfläche eine benutzerdefinierte Farbe.
quelle
Wenn Sie nur die Materialschaltfläche "Flach" möchten, können Sie den Hintergrund mithilfe des Attributs selectableItemBackground anpassen , wie hier erläutert .
quelle
So ändern Sie die Farbe einer einzelnen Schaltfläche
quelle
Für mich war das Problem, dass in Android 5.0 das
android:colorButtonNormal
keine Wirkung hatte und tatsächlich kein Element aus dem Thema (wieandroid:colorAccent
), aber in Android 4.4.3 zum Beispiel. Das Projekt wurde mitcompileSdkVersion
undtargetSdkVersion
auf 22 konfiguriert , daher habe ich alle Änderungen als @Muhammad Alfaifi vorgeschlagen, aber am Ende habe ich festgestellt, dass das Problem die buildToolsVersion war , die nicht aktualisiert wurde. Sobald ich auf 23.0.1 umgestiegen bin, funktioniert alles fast wie gewohnt . Jetzt hat dasandroid:colorButtonNormal
noch keine Wirkung, aber zumindest reagiert der Knopf daraufandroid: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 die Schaltfläche
android:theme=[...]
auch keine Wirkung hatte.quelle
Eine Möglichkeit, dies zu erreichen, ermöglicht es Ihnen, nur auf einen Stil zu zeigen und NICHT ALLE Schaltflächen in Ihrer App gleich zu gestalten.
Fügen Sie in der Datei theme.xml ein Thema hinzu
Jetzt in styles.xml hinzufügen
Zeigen Sie jetzt in Ihrem Layout einfach auf den STIL in Ihrer Schaltfläche
quelle
AKTUALISIEREN
Verwenden Sie die unten stehende Design Support Library (23.2.0) und Appcompatwidgets
In der Android Support Library 22.1 :
Die vollständige Liste der Farbton-Widgets:
Materialdesign für Pre-Lollipop-Geräte :
quelle
Wenn Sie einen AppCompat-Stil wie Widget.AppCompat.Button , Base.Widget.AppCompat.Button.Colored verwenden möchten usw. verwenden , müssen Sie diese Stile mit kompatiblen Ansichten aus der Support-Bibliothek verwenden.
Der folgende Code funktioniert nicht für Pre-Lolipop-Geräte:
Sie müssen AppCompatButton verwenden, um AppCompat-Stile zu aktivieren:
quelle
ImageView
wird durch ersetztAppCompatImageView
und es sollte mit allen Widgets, die die entsprechendeAppCompat
Version haben, gleich sein.android.support.v7.widget.AppCompatImageView
explizit definieren .last target version
@power?Ich benutze das. Ripple-Effekt und Schattenklick funktionieren.
style.xml
Schaltfläche im Layout:
quelle
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>
vor = 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:"
quelle
Nachdem ich 2 Tage lang nach Antworten gesucht hatte, funktionierte das Button-Theming in API <21 für mich nicht.
Meine einzige Lösung besteht darin, die AppCompatButton-Tönung nicht nur mit dem Basis-App-Thema "colorButtonNormal", sondern auch mit der Ansicht backgroundTint wie folgt zu überschreiben:
Sie können dann Ihre Schaltflächenfarbe wie folgt definieren:
quelle
Diese SO-Antwort hat mir geholfen, eine Antwort zu finden: https://stackoverflow.com/a/30277424/3075340
Ich benutze diese Dienstprogrammmethode, um den Hintergrundton einer Schaltfläche festzulegen. Es funktioniert mit Pre-Lollipop-Geräten:
Verwendung im Code:
Auf diese Weise müssen Sie keine ColorStateList angeben, wenn Sie nur die Hintergrundfarbe ändern möchten und nichts weiter, als die hübschen Schaltflächeneffekte beizubehalten und was nicht.
quelle
Ich
android:textColor
habe@null
in meinem Button-Thema eingestellt und es hilft.styles.xml
some_layout.xml
Jetzt ist
colorAccent
die Textfarbe der Schaltfläche in definiertAppTheme
quelle
Wenn Sie Kotlin verwenden, sehen Sie, dass alle Attribute von MaterialButton unterstützt werden. Verwenden Sie nicht das Attribut android: background. MaterialButton verwaltet seinen eigenen Hintergrund, der gezeichnet werden kann. Wenn Sie einen neuen Hintergrund festlegen, kann die deaktivierte Farbe der Materialschaltfläche nicht mehr garantieren, dass die neu eingeführten Attribute ordnungsgemäß funktionieren. Wenn der Standardhintergrund geändert wird, kann die Materialschaltfläche kein genau definiertes Verhalten garantieren. Bei MainActivity.kt
Bei activity_main.xml
Ressource: Materialschaltfläche Farbbeispiel ändern
quelle
Wenn Sie dies per Code in einer beliebigen Farbe tun möchten, verwenden Sie Folgendes:
quelle