Meine Anwendung zeigt einige Benachrichtigungen an und abhängig von den Benutzereinstellungen wird möglicherweise ein benutzerdefiniertes Layout in einer Benachrichtigung verwendet. Es funktioniert gut, aber es gibt ein kleines Problem - Textfarben . Standard Android und fast alle Hersteller-Skins verwenden schwarzen Text vor einem hellen Hintergrund für Benachrichtigungstext, Samsung jedoch nicht: Ihr Benachrichtigungs-Pulldown hat einen dunklen Hintergrund und der Text im Standard-Benachrichtigungslayout ist weiß.
Dies verursacht also ein Problem: Die Benachrichtigungen, die keine ausgefallenen Layouts verwenden, werden gut angezeigt, aber die Benachrichtigungen, die ein benutzerdefiniertes Layout verwenden, sind schwer zu lesen, da der Text schwarz anstelle des Standardweiß ist. Sogar die offizielle Dokumentation legt nur eine #000
Farbe für a fest TextView
, sodass ich dort keine Hinweise finden konnte.
Ein Benutzer war so freundlich, einen Screenshot des Problems zu machen:
So wie verwende ich die Standard - Benachrichtigung Textfarbe aus dem Gerät in meinen Layouts? Ich möchte lieber nicht anfangen, die Textfarbe basierend auf dem Telefonmodell dynamisch zu ändern, da dies viele Aktualisierungen erfordert und Personen mit benutzerdefinierten ROMs je nach verwendetem Skin möglicherweise immer noch das Problem bekommen.
Antworten:
Die Lösung von Malcolm funktioniert gut mit API> = 9. Hier ist die Lösung für ältere API:
Der Trick besteht darin, das Standardbenachrichtigungsobjekt zu erstellen und dann den von
contentView
erstellten Standard zu durchlaufenNotification.setLatestEventInfo(...)
. Wenn Sie die richtige Textansicht gefunden haben, holen Sie sich einfach dietv.getTextColors().getDefaultColor()
.Hier ist der Code, der die Standardtextfarbe und -größe extrahiert (in Pixeln mit skalierter Dichte - sp).
Rufen Sie
extractColors
dh. in onCreate () Ihres Dienstes. Wenn Sie dann die benutzerdefinierte Benachrichtigung erstellen, geben Sie die gewünschte Farbe und Textgröße einnotification_text_color
undnotification_text_size
:quelle
Solution by Malcolm works fine with API>=9
. Sie wissen, Android und Hersteller sind eine schwierige Sache. Verwenden Sie diese Lösung für jede Plattform.Die Lösung besteht darin, integrierte Stile zu verwenden. Der Stil, den Sie benötigen, wird
TextAppearance.StatusBar.EventContent
in Android 2.3 und Android 4.x aufgerufen. In Android 5.x Material Benachrichtigungen verwenden mehrere andere Stile:TextAppearance.Material.Notification
,TextAppearance.Material.Notification.Title
, undTextAppearance.Material.Notification.Line2
. Stellen Sie einfach das entsprechende Texterscheinungsbild für die Textansicht ein, und Sie erhalten die erforderlichen Farben.Wenn Sie interessiert sind, wie ich zu dieser Lösung gekommen bin, finden Sie hier meine Spur von Semmelbröseln. Die Code-Auszüge stammen aus Android 2.3.
Wenn Sie
Notification
den Text mit integrierten Mitteln verwenden und festlegen, wird in der folgenden Zeile das Layout erstellt:Das erwähnte Layout enthält Folgendes,
View
das für die Anzeige des Benachrichtigungstextes verantwortlich ist:Die Schlussfolgerung ist also, dass der benötigte Stil lautet
TextAppearance.StatusBar.EventContent
, welche Definition so aussieht:Sie sollten hier beachten, dass dieser Stil nicht auf eine der integrierten Farben verweist. Daher ist es am sichersten, diesen Stil anstelle einer integrierten Farbe anzuwenden.
Noch etwas: Vor Android 2.3 (API Level 9) gab es weder Stile noch Farben, es gab nur fest codierte Werte. Wenn Sie aus irgendeinem Grund solche alten Versionen unterstützen müssen, lesen Sie die Antwort von Gaks .
quelle
style="@android:style/TextAppearance.StatusBar.EventContent"
) an und erhalten die erforderliche Farbe für den Text. Es wird#ff6b6b6b
im Fall von Vanille-Android sein, oder welche Farbe auch immer dort vom Gerätehersteller eingestellt wurde.Hier ist eine Lösung für jede SDK-Version, die nur Ressourcen verwendet.
PS: Für 2.2- werden hartcodierte Werte verwendet. Daher können Probleme mit einigen seltenen alten benutzerdefinierten Firmwares auftreten.
quelle
Für 2.3+ (aus der Android-Dokumentation ):
Verwenden Sie den Stil
android:TextAppearance.StatusBar.EventContent.Title
für den Primärtext.Verwenden Sie den Stil
android:TextAppearance.StatusBar.EventContent
für den sekundären Text.Tun Sie für 2.2-, was Gaks in einer anderen Antwort auf diesen Thread vorgeschlagen hat.
Wenn Sie gegen 2.2 kompilieren und 2.3+ unterstützen und die Vielzahl der Geräte unterstützen möchten, ist die Lösung von Gaks die einzige, die ich kenne.
Übrigens, was Google über die Verwendung des Werts
?android:attr/textColorPrimary
für 2.2- vorgeschlagen hat, funktioniert nicht. Probieren Sie es einfach mit dem Emulator aus. Gaks Weg ist der einzige Weg.Weitere Ressourcen: Dies und das funktioniert nicht.
quelle
Ich verwende dies in der fraglichen Textansicht:
Es gibt mir weißen Text, wenn der Hintergrund schwarz ist, und schwarzen Text, wenn der Hintergrund weiß ist. Und es funktioniert mindestens so weit zurück wie API 19.
quelle
Sie sollten die in angegebenen Farben verwenden
android.R.color
Beispielsweise:
android.R.color.primary_text_light
Benutzerdefinierte ROM-Entwickler und Android-Skin-Designer sollen diese aktualisieren, damit die Farben Ihrer App mit dem Rest des Systems übereinstimmen können. Dazu gehört, dass Sie sicherstellen, dass Ihr Text im gesamten System ordnungsgemäß angezeigt wird.
quelle
android.R.color
? Alle Textfarben haben sowohl "dunkle" als auch "helle" Variationen.Schauen Sie sich diese Anleitung an: Sehen Sie sich http://developer.android.com/guide/topics/ui/notifiers/notifications.html#CustomExpandedView Wenn Sie Ihre Hintergrundfarbe für den LinearLayout-Container eingerichtet haben, können Sie Ihre Farben in Benachrichtigung für Text und der Hintergrund.
Wenn die Standardfarbe für den Benachrichtigungstext von der Launcher-Anwendung definiert wird, können Sie sie nicht aus den Standardeinstellungen für Android abrufen, es sei denn, der Launcher teilt diese Informationen.
Haben Sie jedoch versucht, diese Zeile android: textColor = "# 000" aus Ihrem Layout zu entfernen, damit sie automatisch die Standardfarbe erhält?
quelle
Ich habe eine sehr einfache Lösung gefunden, bei der der Name des von Android bereitgestellten Attributs direkt geändert wird.
Wie Sie in diesem Tutorial sehen können: http://www.framentos.com/android-tutorial/2012/02/20/how-to-create-a-custom-notification-on-android/
Sie müssen nur ein anderes Attribut verwenden:
Hoffe das kann dir helfen!
quelle
Ich weiß, dass es eine alte Frage ist, aber sie könnte jemand anderem helfen. ) Ich mache das in meiner App und das funktioniert in wenigen Zeilen perfekt:
quelle
Die Lösung von @Malckom hat mir bei Lolipop mit dunklem Benachrichtigungshintergrund aufgrund von TextAppearance.Material.Notification.Title nicht geholfen. Die Lösung von @grzaks hat dies getan, jedoch mit einigen Änderungen beim Erstellen von Benachrichtigungen:
quelle
Hier ist, was für mich funktioniert hat, um diesen Fehler zu beheben. Fügen Sie der Datei styles.xml Folgendes hinzu
quelle