In der neuen AppCompat-Bibliothek können wir die Schaltfläche folgendermaßen tönen:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/follow"
android:id="@+id/button_follow"
android:backgroundTint="@color/blue_100"
/>
Wie kann ich den Farbton der Schaltfläche programmgesteuert in meinem Code einstellen? Ich versuche im Grunde, eine bedingte Färbung der Schaltfläche basierend auf einigen Benutzereingaben zu implementieren.
android
android-appcompat
Stephane
quelle
quelle
Antworten:
Gemäß der Dokumentation der verwandte Methode
android:backgroundTint
ist setBackgroundTintList (ColorStateList Liste)Aktualisieren
Folgen Sie diesem Link , um zu erfahren, wie Sie eine Farbstatuslistenressource erstellen.
dann laden Sie es mit
wo
contextInstance
ist eine Instanz von aContext
mit AppCompart
quelle
ViewCompat.setBackgroundTintList(View, ColorStateList)
kann bis zur API 4 verwendet werden. Er funktioniert jedoch nur für Ansichten, dieTintableBackgroundView
beispielsweise implementiert werdenAppCompatButton
(anstelle der üblichenButton
).ViewCompat.setBackgroundTintList(View, ColorStateList)
von @Jon Adams ist jetzt noch sinnvoller, da View.setSupportButtonTintList nur mitRestrictTo
Anmerkungen versehen ist. Details hier: developer.android.com/reference/android/support/annotation/…Du könntest benutzen
Ich würde Ihnen jedoch empfehlen, eine Zeichnungsfarbe für die Unterstützungsbibliothek zu verwenden, die erst gestern veröffentlicht wurde:
Weitere Informationen finden Sie in diesem Blogbeitrag (siehe Abschnitt "Zeichenbare Tönung").
quelle
Scheint, als hätten Ansichten eigene Mechaniken für das Farbtonmanagement, daher wird eine bessere Farbtonliste erstellt:
quelle
Informationen zur ordnungsgemäßen Erweiterung der Antwort von dimsuz durch Bereitstellung einer realen Codesituation finden Sie im folgenden Codeausschnitt:
Diese Lösung ist für das Szenario vorgesehen, in dem ein Zeichen als Hintergrund für die Schaltfläche verwendet wird. Es funktioniert auch auf Pre-Lollipop-Geräten.
quelle
Haben Sie so etwas versucht?
Beachten Sie, dass getResources () nur in einer Aktivität funktioniert. Es kann aber auch in jedem Kontext aufgerufen werden.
quelle
So geht's in Kotlin:
quelle
Sie können DrawableCompat verwenden, z
quelle
Dies ist in der neuen Materialschaltfläche aus der Materialdesignbibliothek einfach zu handhaben. Fügen Sie zunächst die Abhängigkeit hinzu:
Verwenden Sie dann in Ihrem XML Folgendes für Ihre Schaltfläche:
und wenn Sie die Farbe ändern möchten, ist hier der Code in Kotlin: Er ist nicht veraltet und kann vor Android 21 verwendet werden:
quelle
Ich habe es geschafft, meine zur Arbeit zu bringen, indem ich sie benutzt habe
CompoundButtonCompat.setButtonTintList(button, colour)
.Nach meinem Verständnis funktioniert dies unabhängig von der Android-Version.
quelle
Ich hatte ein ähnliches Problem. Ich wollte einen komplexen zeichnbaren Hintergrund für eine Ansicht einfärben, die auf einem Farbwert (int) basiert. Es ist mir gelungen, den Code zu verwenden:
Wobei Farbe ein int-Wert ist, der die erforderliche Farbe darstellt. Dies stellt die einfache XML ColorStateList dar:
Hoffe das hilft.
quelle
ColorStateList.valueOf(ColorInt)
Für ImageButton können Sie Folgendes verwenden:
quelle
Wenn Sie
Kotlin
und verwendenMaterial Design
, können Sie die FarbeMaterialButton
wie folgt ändern :Sie können es noch besser verbessern, indem Sie eine Erweiterungsfunktion für Sie erstellen, um Ihren
MaterialButton
Code lesbarer und Ihre Codierung etwas komfortabler zu machen:Dann können Sie Ihre Funktion überall so verwenden:
quelle
Zusätzlich zur Antwort von Shayne3000 können Sie auch eine Farbressource verwenden (nicht nur eine int-Farbe). Kotlin- Version:
quelle
Die hier vorgeschlagene Antwort funktioniert unter Android 5.0 nicht richtig, wenn Ihre XML-basierte Farbstatusliste auf Themenattribute verweist. Zum Beispiel habe ich eine XML-Farbstatusliste wie folgt:
Dies als Hintergrund zu verwendenTint von XML funktioniert gut auf Android 5.0 und allem anderen. Wenn ich jedoch versuche, dies in Code wie folgt einzustellen:
(Tu das nicht)
Es spielt eigentlich keine Rolle, ob ich die Aktivität oder den Kontext der Schaltfläche an die ContextCompat.getColorStateList () -Methode übergebe. Außerdem wird mir weder die richtige Farbstatusliste für das Thema angezeigt, in dem sich die Schaltfläche befindet. Dies liegt daran, dass die Verwendung von Designattributen in Farbstatuslisten erst in API 23 unterstützt wurde und ContextCompat nichts Besonderes unternimmt, um diese Probleme zu beheben. Stattdessen müssen Sie AppCompatResources.getColorStateList () verwenden, das auf Geräten <API 23 eine eigene Ressourcenanalyse / Themenattributauflösung durchführt .
Stattdessen müssen Sie Folgendes verwenden:
TLDR: Verwenden Sie AppCompatResources und nicht -ContextCompat-, wenn Sie aufgelöste Themenressourcen für alle API-Versionen von Android benötigen.
Weitere Informationen zum Thema finden Sie in diesem Artikel .
quelle