[android] Benutzerdefinierte Benachrichtigungslayouts und Textfarben



Answers

Die Lösung besteht darin, integrierte Stile zu verwenden. Der benötigte Stil heißt TextAppearance.StatusBar.EventContent in Android 2.3 und Android 4.x. In Android 5.x-Materialbenachrichtigungen werden verschiedene andere Stile verwendet: TextAppearance.Material.Notification , TextAppearance.Material.Notification.Title und TextAppearance.Material.Notification.Line2 . Legen Sie einfach die entsprechende Textdarstellung für die Textansicht fest, und Sie erhalten die erforderlichen Farben.

Wenn Sie interessiert sind, wie ich zu dieser Lösung gekommen bin, hier ist meine Spur von Brotkrumen. Die Codeauszüge stammen aus Android 2.3.

  1. Wenn Sie die Notification und den Text mithilfe von integrierten Mitteln festlegen, wird in der folgenden Zeile das Layout erstellt:

    RemoteViews contentView = new RemoteViews(context.getPackageName(),
            com.android.internal.R.layout.status_bar_latest_event_content);
    
  2. Das erwähnte Layout enthält die folgende View die für das Anzeigen von Benachrichtigungstext zuständig ist:

    <TextView android:id="@+id/text"
        android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:fadingEdge="horizontal"
        android:paddingLeft="4dp"
        />
    
  3. Die Schlussfolgerung ist, dass der erforderliche Stil TextAppearance.StatusBar.EventContent , dessen Definition folgendermaßen aussieht:

    <style name="TextAppearance.StatusBar.EventContent">
        <item name="android:textColor">#ff6b6b6b</item>
    </style>
    

    Sie sollten hier beachten, dass dieser Stil keine der eingebauten Farben referenziert, also ist der sicherste Weg, diesen Stil anstelle einer eingebauten Farbe anzuwenden.

Noch eine Sache: Vor Android 2.3 (API Level 9) gab es weder Stile noch Farben, es gab nur fest codierte Werte. Wenn Sie solche alten Versionen aus irgendeinem Grund unterstützen müssen, sehen Sie sich die Antwort von Gaks an .

Question

Meine Anwendung zeigt einige Benachrichtigungen an, und abhängig von den Benutzereinstellungen verwendet sie möglicherweise ein benutzerdefiniertes Layout in einer Benachrichtigung. Es funktioniert gut, aber es gibt ein kleines Problem - Textfarben . Stock Android und fast alle Hersteller Skins verwenden schwarzen Text vor einem hellen Hintergrund für Benachrichtigungstext, aber Samsung nicht: ihre Benachrichtigung Pulldown hat einen dunklen Hintergrund und der Text in der Standard-Benachrichtigungslayout ist weiß.

Dies führt zu einem Problem: Die Benachrichtigungen, die keine ausgefallenen Layouts verwenden, sind gut sichtbar, aber die, die ein benutzerdefiniertes Layout verwendet, ist schwer zu lesen, da der Text schwarz statt des Standard-Weiß ist. Sogar die offizielle Dokumentation setzt nur eine #000 Farbe für ein TextView , so dass ich dort keine Zeiger finden konnte.

Ein Benutzer war so nett, einen Screenshot des Problems zu machen:

Wie verwende ich die Standardfarbe für Benachrichtigungstexte vom Gerät in meinen Layouts? Ich würde lieber nicht beginnen, die Textfarbe basierend auf dem Telefonmodell dynamisch zu ändern, da dies eine Menge Aktualisierungen erfordert und Leute mit benutzerdefinierten ROMs das Problem je nach verwendetem Skin immer noch bekommen können.




Für 2.3+ (Von Android-Dokumentation ):

Verwenden Sie den Stil android:TextAppearance.StatusBar.EventContent.Title für den primären Text.

Verwenden Sie den Stil android:TextAppearance.StatusBar.EventContent für den sekundären Text.

Für 2.2- machen Sie das, was Gaks in einer anderen Antwort auf diesen Thread vorgeschlagen hat.

Wenn Sie gegen 2.2 kompilieren und 2.3 + unterstützen möchten und die gesamte Gerätevielfalt unterstützen, ist die Lösung von Gaks die einzige, die ich kenne.

Übrigens, was Google vorgeschlagen hat, den Wert ?android:attr/textColorPrimary für 2.2-" zu verwenden, funktioniert nicht. Probieren Sie es einfach mit dem Emulator. Gaks 'Art ist der einzige Weg.

Weitere Ressourcen: This und das funktioniert nicht.




Lösung von @Malckom hat mir bei Lolipop mit dunklem Benachrichtigungshintergrund wegen TextAppearance.Material.Notification.Title nicht geholfen ist eine systemfest codierte Farbe. Lösung von @grzaks tat, aber mit einigen Änderungen im Prozess der Erstellung von Benachrichtigungen:

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(this)
                          .setContentTitle(NOTIFICATION_TITLE_TIP)
                          .setContentText(NOTIFICATION_TEXT_TIP);
Notification ntf = mBuilder.build();
// ...
if (NOTIFICATION_TEXT_TIP.equals(szText)) {
    notification_text_color = text.getTextColors().getDefaultColor();
} else {
    if (NOTIFICATION_TITLE_TIP.equals(szText)) {
        notification_title_color = text.getTextColors().getDefaultColor();
    }
}
// ...






Related