Le fond de notification dans Android Lollipop est blanc. Comment puis-je le changer?
Je veux afficher une notification d'un message dans mon application. Dans les versions précédentes d'Android, tout est ok, mais en Sucette la notification d'arrière-plan est blanc.
J'ai utilisé ce code XML pour ma notification de mise en page dans layout_message_notification.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_messageNotification"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent">
<LinearLayout
android:layout_width="0dp"
android:layout_weight=".2"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:src="@drawable/message_icon"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_weight=".8"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<TextView
android:id="@+id/textView_notification_title"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="right|center_vertical"
android:layout_margin="15dp"/>
</LinearLayout>
</LinearLayout>
Ma notification en sucette est indiqué comme ceci:
Comment puis-je procéder à la notification d'arrière-plan sombre ou transparente, comme dans les versions précédentes d'Android?
source d'informationauteur Mansour
Vous devez vous connecter pour publier un commentaire.
Par la suite, si vous souhaitez suivre les documents officiels de la conception spécification
et utiliser la mise en page personnalisée de vos notifications, vous peut-être envisager de ne pas primordial arrière-plan par défaut, mais le changement de style de texte en raison de version de l'API. Vous pouvez l'atteindre par la création de deux ressources des fichiers de style et utilisé conformément à la version actuelle de l'API:
values-v21/notification_styles.xml
et
values/notification_styles.xml
Cette réponse décrit un hacky méthode de changement de notification couleur d'arrière-plan.
Attention: ceci est un sans-papiers solution de contournement; il est basé sur la réflexion et peuvent être réparties sur les custom firmwares; il est applicable à Android Lollipop et de la Guimauve versions seulement; il ne fonctionnera pas sur Android N et les versions supérieures. Je recommande de rester avec la couleur par défaut, sauf si vous avez une raison sérieuse pour l'éviter.
POURQUOI
Il n'y a aucun moyen juridique pour définir une couleur de fond pour la fonction de notification personnalisée. Google a décidé que les notifications doivent être de couleur blanche ou gris clair en fonction de ses priorités selon la Conception de Matériel. Cependant, Google a également effectué deux exceptions à cette règle:
arrière-plan;
MediaStyle
peut être de n'IMPORTE quelle couleur.Comme un résultat de la seconde exception, cette limitation semble illogique et irraisonnés, et c'est la seule excuse pourquoi vous voulez toujours utiliser une couleur personnalisée à la place de celle qui est recommandée (ou forcé?) par Google.
CE QUI EST À L'INTÉRIEUR DE
Permet de regarder en
BaseStatusBar
de voir comment cette limitation est imposée. Le seul endroit où la couleur de fond de la notification est calculé est applyColorsAndBackgrounds méthode.Première branche de l'
if
déclaration est pour les anciennes applications. La seule façon d'obtenir ici est de définir la cible SDK de votre demande ci-dessousBuild.VERSION_CODES.LOLLIPOP
. Le fond sera tourné en noir dans ce cas.Nous nous sommes intéressés à la
entry.row.setTintColor
déclaration. Pour l'atteindre, plusieurs vérifications doivent être transmises, y compris celle contenue dans isMediaNotification méthode. Ici, ils sont:com.android.internal.R.id.status_bar_latest_event_content
comme son ID.com.android.internal.R.id.media_actions
comme son ID.COMMENT
Les plus problématiques sont les Id tant qu'ils sont déclarés dans les ressources à l'interne et ne peut être consulté à partir de l'application de mise en page XML.
Le deuxième problème est que la
RemoteViews
utilisé dans la notification est juste une ID de la mise en page des ressources au sein de l'application et ne peut pas être construite dans le code. En conséquence, nous ne pouvons pas ajouter des mises en page avec des Identifiants requis pour passer tous les contrôles mentionnés ci-dessus.Cependant, Google a ajouté la
addView
etremoveAllViews
méthodes dansRemoteViews
pour répondre à leurs besoins (ils sont utilisés dans leMediaStyle
de notification) et j'ai oublié de les rendre privés.Donc, l'idée finale est simple:
removeAllViews
addView
media_actions
invisible en vue à l'intérieur de notre mise en page personnalisée (pour passer la 3ème case)Inconvénients:
SOLUTION
Notre coutume du grand écran doit contenir
FrameLayout
avecandroid.R.id.empty
comme son ID. En fait, toute pièce d'identité peut être utilisé ici, assurez-vous juste que vous faites référence à la même ID dans le code (voir ci-dessous).Il est possible d'utiliser un autre modèle au lieu de
notification_template_material_big_media_narrow
sur le haut niveau de manipuler la taille de la grande vue. Recherche pour l'un ici parmi notification_template_xxx.xml les fichiers. Mais ne pas oublier de mettremedia_actions
dans la hiérarchie.C'est le corriger notifiction du comportement.
Si vous voulez avoir un contrôle direct sur cet aspect, je vous suggère de faire ce qui suit:
Créer une version alternative de la
layout_message_notification.xml
à l'intérieur du dossierres/layout-v21
Faire un peu de changement sur cette nouvelle version en changeant l'extérieur mise en couleur d'arrière-plan: