Ich habe also angefangen, die neue Snackbar in der Design Support Library zu verwenden, aber ich habe festgestellt, dass die Definition von "android: textColor" in Ihrem Thema für die Textfarbe der Snackbar gilt. Dies ist offensichtlich ein Problem, wenn Ihre primäre Textfarbe dunkel ist.
Kennt jemand einen Weg, um dies zu umgehen, oder hat er Ratschläge, wie ich meinen Text einfärben soll?
BEARBEITEN Januar 2017: (Post-Answer)
Es gibt zwar einige benutzerdefinierte Lösungen, um das unten stehende Problem zu beheben, aber es ist wahrscheinlich gut, die richtige Methode zum Thema Snackbars bereitzustellen.
Erstens sollten Sie android:textColor
Ihre Themen wahrscheinlich überhaupt nicht definieren (es sei denn, Sie wissen wirklich, in welchem Umfang das Thema verwendet wird). Dadurch wird die Textfarbe praktisch jeder Ansicht festgelegt, die mit Ihrem Thema verbunden ist. Wenn Sie Textfarben in Ihren Ansichten definieren möchten, die nicht Standard sind, verwenden Sie android:primaryTextColor
dieses Attribut in Ihren benutzerdefinierten Ansichten und verweisen Sie darauf.
Informationen zum Anwenden von Themen Snackbar
finden Sie in diesem Qualitätsleitfaden aus einem Materialdokument eines Drittanbieters: http://www.materialdoc.com/snackbar/ (Befolgen Sie die Implementierung des programmatischen Themas, damit es nicht auf einem XML-Stil basiert.)
Als Referenz:
// create instance
Snackbar snackbar = Snackbar.make(view, text, duration);
// set action button color
snackbar.setActionTextColor(getResources().getColor(R.color.indigo));
// get snackbar view
View snackbarView = snackbar.getView();
// change snackbar text color
int snackbarTextId = android.support.design.R.id.snackbar_text;
TextView textView = (TextView)snackbarView.findViewById(snackbarTextId);
textView.setTextColor(getResources().getColor(R.color.indigo));
// change snackbar background
snackbarView.setBackgroundColor(Color.MAGENTA);
(Sie können auch Ihre eigenen benutzerdefinierten Snackbar
Layouts erstellen, siehe den obigen Link. Tun Sie dies, wenn sich diese Methode zu hackig anfühlt und Sie eine sicher zuverlässige Möglichkeit suchen, Ihre benutzerdefinierte Snackbar durch mögliche Aktualisierungen der Support-Bibliothek dauerhaft zu erhalten.)
Alternativ finden Sie in den Antworten unten ähnliche und möglicherweise schnellere Antworten zur Lösung Ihres Problems.
android:textColorPrimary
Antworten:
Ich weiß, dass dies bereits beantwortet wurde, aber der einfachste Weg, den ich gefunden habe, war die direkte Verwendung der
Html.fromHtml
Methode und einesfont
Tagsquelle
Ich fand dies unter Was sind die neuen Funktionen der Android Design Support Library und wie wird die Snackbar verwendet?
Dies funktionierte bei mir, um die Textfarbe in einer Snackbar zu ändern.
UPDATE: ANDROIDX: Wie dblackker in den Kommentaren hervorhebt, ändert sich mit der neuen AndroidX-Unterstützungsbibliothek der Code zum Ermitteln der ID von Snackbar TextView in:
quelle
snackbar_action
anstelle von verwendensnackbar_text
. Siehe diese Antwort für ein Beispiel: stackoverflow.com/a/36800101/293280snack.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
Das Hacken
android.support.design.R.id.snackbar_text
ist fragil. Ein besserer oder weniger hackiger Weg, dies zu tun, ist:quelle
Erstellt diese Kotlin-Erweiterungsfunktion, die ich in meinen Projekten verwende:
Verwendung wie erwartet:
quelle
com.google.android.material.R.id.snackbar_text
Sie diese Option, wenn Sie auf AndroidX migrieren.Also gut, ich habe es behoben, indem ich die Art und Weise, wie ich Textfarben mache, grundlegend neu organisiert habe.
In meinem Lichtthema stellte ich das ein
android:textColorPrimary
, wasnormal dark text
ich wollte, und ich stellteandroid:textColor
es einwhite
.Ich habe alle meine Textansichten und Schaltflächen aktualisiert
android:textColor="?android:attr/textColorPrimary".
Da die Snackbar aus zeichnet
textColor
, setze ich einfach meinen gesamten anderen Text auftextColorPrimary
.EDIT JANUAR 2017: ---------------------------------------------- ------ ------.
Wie in den Kommentaren angegeben und in der bearbeiteten Originalfrage oben angegeben, sollten Sie dies wahrscheinlich nicht
android:textColor
in Ihren Themen definieren , da dies die Textfarbe jeder Ansicht innerhalb des Themas ändert.quelle
android:textColor
in Ihrem Thema überhaupt nicht definieren . Es ist ein Stil - AttributTextView
. Wenn Sie es in Ihrem Thema definieren , überschreiben Sie die Textfarbe allerTextView
oderButton
ohne Angabe der Textfarbe in XML. Das ist auch die Snackbar-Nachricht, die normalerweise Farbe von ihrer dunklen Themenüberlagerung nimmt .Ein Ansatz besteht darin, Spannweiten zu verwenden:
Mit Spannweiten können Sie auch mehrere Farben und Stile in einer Snackbar hinzufügen. Hier ist eine nette Anleitung:
https://androidbycode.wordpress.com/2015/06/06/material-design-snackbar-using-the-design-support-library/
quelle
Wenn Sie auf AndroidX migriert sind, verwenden Sie
com.google.android.material.R.id.snackbar_text
stattandroid.support.design.R.id.snackbar_text
zum Ändern der Textfarbe auf der Snackbar.quelle
Der einzige Weg, den ich sehe, ist,
getView()
sein Kind zu benutzen und durch es zu radeln. Ich weiß nicht, ob es funktionieren wird, und es ist schlecht, wie es aussieht. Ich hoffe, dass sie bald eine API zu diesem Problem hinzufügen werden.quelle
Wenn Sie Ihren Code auf AndroidX migrieren, lautet die TextView-Eigenschaft jetzt:
quelle
Dies ist, was ich benutze, wenn ich benutzerdefinierte Farben benötige
Und konsumiert als:
quelle
Ich habe mein Thema geändert
zu
Es hat funktioniert. Versuchen Sie, ein einfaches Thema anstelle von Licht oder einem anderen Thema zu verwenden.
quelle
Wenn Sie sich für die schmutzige und hackige Lösung entscheiden, TextView in der Snackbar anhand der ID zu finden, und bereits auf AndroidX migriert sind, lautet der folgende Code:
quelle
Sie können diese Bibliothek verwenden: https://github.com/SandroMachado/restaurant
Haftungsausschluss: Ich habe die Bibliothek erstellt.
quelle
Find by id hat bei mir nicht funktioniert, daher habe ich eine andere Lösung gefunden:
quelle
Verwenden Sie das
Snackbar
in der Materialkomponentenbibliothek enthaltene und wenden Sie das ansetTextColor
um die Textfarbe zu definierensetActionTextColor
um die von der Aktion verwendete Textfarbe zu definieren. Sie können eine Farbe oder einen Farbwähler verwendensetBackgroundTint
um die Hintergrundfarbe der Snackbar zu definierenEtwas wie:
quelle
Ich habe einen einfachen Code, der hilft, eine Instanz der beiden Textansichten von Snackbar zu erhalten. Danach können Sie alle Methoden aufrufen, die für eine Textansicht gelten.
quelle
Um Ihre wertvolle Entwicklungszeit zu sparen, verwende ich folgende statische Methode:
So sieht es aus:
quelle
Wenn Sie sich in Kotlin befinden , können Sie eine Erweiterung erstellen:
Verwendung :
quelle
Wie bei neuen AndroidX Jitpack-Komponenten
Verwenden Sie diese Erweiterung, die ich erstellt hatte
Verwenden Sie es so
quelle
Dies ist meine Problemumgehung, um diese Art von Problem bei der
androidx
Verwendung zu lösenkotlin
Sie müssen die
mContent
Inside-onViewCreated
Methode wie unten initialisierenquelle
Derzeit (Januar 2020) mit
com.google.android.material:material:1.2.0
und wahrscheinlich auch1.1.0
Ist definitiv der beste Weg, dies zu tun, indem diese Stile überschrieben werden:
Wenn Sie
.Bridge
am Ende ein Materialthema mit verwenden , ist aus irgendeinem Grund keiner dieser Stile definiert. Snackar wird also ein altes Layout ohne diese Stile verwenden.Ich habe im Quellcode festgestellt, dass beide
snackbarButtonStyle
undsnackbarTextViewStyle
definiert werden müssen, sonst wird es nicht verwendet.quelle
Ich habe auch das gleiche Problem bemerkt. Dank der Antworten hier habe ich eine kleine Klasse erstellt, die helfen kann, dieses Problem einfacher zu lösen, indem sie diese ersetzt:
mit diesem:
Hier ist meine Klasse:
}}
quelle