Ich habe eine Schaltfläche in meiner Aktivität und möchte, dass die Akzentfarbe meines Themas angezeigt wird. Anstatt meine eigenen Drawables zu erstellen, wie wir es vor Lollipop tun mussten, möchte ich natürlich das neue backgroundTint
Attribut verwenden.
<Button
android:id="@+id/btnAddCode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/accent"
android:text="@string/addressInfo_edit_addCode" />
Leider hat es keine Auswirkung, die Schaltfläche bleibt grau.
Ich habe verschiedene Werte für ausprobiert backgroundTintMode
, was nichts geändert hat.
Ich habe es auch programmgesteuert in meiner Aktivität versucht, was nichts geändert hat.
addCodeView.findViewById(R.id.btnAddCode).setBackgroundTintList(
getResources().getColorStateList(R.color.accent));
Warum wird mein Farbton ignoriert?
EDIT: Nur zur Klarstellung, ich teste tatsächlich auf einem Lollipop-Gerät. Andere Widgets (z. B. EditText) werden korrekt und automatisch getönt.
Antworten:
Getestet auf API 19 bis API 27
erzeugt Ausgabe als -
quelle
Die schlechten Nachrichten
Wie BoD sagt, ist es bedeutungslos, den Hintergrund eines Buttons in Lollipop 5.0 (API-Level 21) zu tönen.
Die guten Nachrichten
Lollipop 5.1 (API-Level 22) scheint dies behoben zu haben, indem btn_mtrl_default_shape.xml (unter anderem) geändert wurde: https://android.googlesource.com/platform/frameworks/base/+/6dfa60f33ca6018959ebff1efde82db7d2aed1e3%5E !
Die gute Nachricht
Die neue Support-Bibliothek (Version 22.1+) bietet vielen Komponenten, einschließlich AppCompatButton, abwärtskompatible Unterstützung für das Abtönen !
Leider
android:backgroundTint
funktioniert die Eigenschaft immer noch nicht (vielleicht mache ich etwas falsch) - also müssen Sie denColorStateList
In-Code mit einstellensetSupportBackgroundTintList()
. Es wäre wirklich schön, wenn wirandroid:backgroundTint
in Zukunft Unterstützung sehen würden . Update : Marcio Granzotto hat kommentiert, dass esapp:backgroundTint
auf AppCompatButton funktioniert! Beachten Sieapp:
, dass dies nichtandroid:
der Fall ist, da es sich in der App / Bibliothek befindet.Ihre Aktivität wird automatisch eine
AppCompatButton
anstelle der normalen aufblasen,Button
wenn Sie es von erben lassenAppCompatActivity
.Sie sollten das natürlich
ColorStateList
von einer Farbressource bekommen, aber ich war faul, also ...Oh, und vergessen Sie nicht, Ihr App-Thema auf eines der
Theme.AppCompat
Themen zu stützen, sonst werden die kompatiblen Ansichten sehr, sehr traurig sein ...;)Dies funktionierte sowohl bei 2.3.7 (Lebkuchen MR1) als auch bei 5.0 (Lollipop 'Classic').
quelle
colorButtonNormal
mit AppCompat 22.1.1 (das Thema nur für die Schaltflächen einstellen) verwenden, es funktioniert für mich unter 4.4.4 und 5.1.new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00});
können Sie präziser schreibenColorStateList.valueOf(0xffffcc00);
.Es scheint, dass das Abtönen einer Ripple Drawable bedeutungslos ist (und der Standardhintergrund einer Schaltfläche ist ein Ripple Drawable).
Nachdem ich mir die Standardschaltfläche der Plattform angesehen hatte, fand ich den "richtigen" Weg, dies zu tun: Sie müssen dies in Ihrem Thema definieren:
(Natürlich ist dies nur für Level 21+.)
Warnung: Da dies in einem Thema definiert ist, wird für alle Schaltflächen (zumindest alle Schaltflächen in Aktivitäten, die dieses Thema verwenden) die angegebene Farbe verwendet.
Als Bonus können Sie auch die Welligkeitsfarbe ändern, indem Sie Folgendes definieren:
quelle
colorControlHighlight
würde aber viele andere Widgets ändern. Ich bin froh, dass du es geschafft hast.Um Probleme im Zusammenhang mit dem Abtönen unter Android 5.0.x zu beheben, verwende ich Folgendes:
Die Unterstützungsmethode wird nur für API 21 und die ViewCompat-Methode für alle anderen Fälle verwendet.
quelle
if (view instanceof TintableBackgroundView) { ((TintableBackgroundView) view).setSupportBackgroundTintList(tint); } else { ViewCompat.setBackgroundTintList(view, tint); }
Normalerweise mache ich das dynamisch mit PorterDuff:
Sie können verschiedene Füllmethoden überprüfen hier und schöne Beispiele hier .
quelle
Verwenden Sie einfach
app:backgroundTint
anstelle vonandroid:backgroundTint
, der Farbton wird unterhalb von Lollipop wirksam. Der Grund hierfür ist dieAppCompatActivity
VerwendungAppCompatViewInflater
zur automatischen Wechsel - Taste oder Textview zu AppCompatButton oder AppCompatTextView, dann inapp:backgroundTint
Kraft treten.In meinem Projekt habe ich es benutzt, es hat funktioniert.
quelle
Ich denke, Sie müssen sich
android:background
eingestellt haben, umandroid:backgroundTint
Arbeit zu machen .Um genauer zu sein, kann ich davon ausgehen, dass Sie nicht
backgroundTint
den Standard-Schaltflächenhintergrund aus Materialthemen verwenden können, der als definiert istRippleDrawable
.quelle
Ein ähnliches Problem wurde auf Google https://code.google.com/p/android/issues/detail?id=201873 gemeldet
Aber nach der Veröffentlichung der Android Support Library, Revision 23.2.1 (März 2016) ist dieser Fehler behoben.
Problem: FloatingActionButton.setBackgroundTintList (@Nullable ColorStateList-Farbton) ändert die Hintergrundfarbe nicht mehr
Aktualisieren Sie die Support-Bibliothek auf
Android Support Library to 23.2.1
Verwenden Sie die unten stehende Design Support Library (23.2.1) und Appcompatwidgets
Materialdesign für Pre-Lollipop-Geräte :
Android Support Library 22.1 :
quelle
Verwenden Sie einfach app: backgroundTint anstelle von android: backgroundTint
quelle
Wenn wir uns den Quellcode der Support Library ansehen, sehen wir, dass er normalerweise die bekannten Schaltflächen färbt, aber wenn wir die Form unserer Schaltfläche ändern (ich habe eine runde Schaltfläche), funktioniert der Farbton in API <= 21 nicht in Ordnung. Wir können auch sehen, dass TintManager zur öffentlichen Klasse wurde (appcompat-v7: 23.1.1), sodass wir ColorStateList aus der Standardschaltflächenform (die in 5.0 in Ordnung getönt ist) für das aktuelle Thema übernehmen können (sodass wir das Array nicht erstellen müssen von Farben):
quelle
Weil das Attribut
backgroundTint
nur in API-Level 21 und höher verwendet wirdquelle
Beachten Sie, dass die am meisten aktualisierte Bibliothek von recyclerview auch diesen Fehler verursachen kann.
Dieser Befehl
hat in der Vergangenheit perfekt funktioniert, aber hör auf für mich zu arbeiten. Nach Recherchen stellt sich heraus, dass die Ursache die Bibliothek ist, die zu Gradle-Abhängigkeiten hinzugefügt wurde:
Also habe ich versucht, es auf 23.02.1 zu ändern, wie es hier in Amit Vaghela Post empfohlen wurde. Ich wechselte zu
Aber gradle Fehler sagte, dass recyclerview lib diese Version (23.02.1) nicht hat (gradle konnte sie nicht in Jcenter raw.github oder repo finden).
Dann, weil ich wusste, dass der Befehl setBackgroundTintList in der Vergangenheit mit Version 22.02.0 'in allen anderen Bibliotheken, die ich in Gradle-Abhängigkeiten habe, gut funktioniert hat. also ändere ich es auf:
Und jetzt funktioniert es wieder.
quelle
Ich bin nicht sicher, ob dies empfohlen wird, aber Sie können dies versuchen:
Im Allgemeinen funktioniert es. Versucht,
ViewCompat
aber es scheint nicht richtig zu funktionieren.quelle
Sie können
backgroundTint
<android.support.design.button.MaterialButton
mit"com.android.support:design:28.0.0-rc01"
Version verwendenquelle
Wenn Sie Androidx verwenden, können Sie das Problem mit Android 5.1 beheben, indem Sie sowohl ein Präfix als auch ein Präfix hinzufügen.
Die Auswahl von button_primary befindet sich in einem
color
Ordner mit folgendem Inhalt:und wende es auf den normalen Knopf an
AppCompatActivity
quelle