Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Fondo de notificación en Android Lollipop es blanco. ¿Cómo puedo cambiarlo?

Quiero mostrar una notificación para un mensaje en mi aplicación. En versiones anteriores de Android todo está bien, pero en Lollipop el fondo de la notificación es blanco. Utilicé este código XML para mi diseño de notificación en 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> 

Mi notificación en lollipop se muestra así: Estilo de notificación en lollipop

  • Eliminar un detector de onclick
  • Cómo compilar GCC para android?
  • Rotando un dibujable en Android
  • ActionBar Acción Elementos que no se muestran
  • Cambiar el color del LED para las notificaciones
  • ¿Cómo debo manejar "No hay conexión a Internet" con Retrofit en Android
  • ¿Cómo puedo hacer que el fondo de notificación sea oscuro o transparente, como en versiones anteriores de Android?

  • Cambiar el color de línea inferior de EditText con appcompat v7
  • Realidad aumentada (AR) en HTML5 y WebGL
  • Comprueba mi diseño: el botón inferior sigue subiendo por encima del teclado
  • ¿Cuáles son las ventajas exactas de Fragments en Android 3.0?
  • Gradle DSL Método no encontrado: packagingOptions ()
  • Acceso a una fuente en la carpeta de activos del archivo XML de Android
  • 3 Solutions collect form web for “Fondo de notificación en Android Lollipop es blanco. ¿Cómo puedo cambiarlo?”

    Eventualmente, si te gusta seguir la especificación oficial de diseño de material

    Utilice siempre recursos de estilo para el texto de una notificación personalizada

    Y utilizar el diseño personalizado de sus notificaciones, tal vez considere no sobreescribir el fondo predeterminado, sino cambiar el estilo de texto debido a la versión de la API. Puede lograrlo creando dos archivos de estilo de recurso y los utiliza de acuerdo con la versión actual de la API:

    Values-v21 / notification_styles.xml

     <?xml version="1.0" encoding="utf-8"?> <resources> <!-- according to official recommendation custom notifications should has the same text style as default one--> <style name="NotificationHeader" parent="@android:style/TextAppearance.Material.Notification.Title" /> <style name="NotificationContent" parent="@android:style/TextAppearance.Material.Notification.Line2" /> </resources> 

    y

    Values ​​/ notification_styles.xml

     <?xml version="1.0" encoding="utf-8"?> <resources> <!-- according to official recommendation custom notifications should has the same text style as default one--> <style name="NotificationHeader" parent="@android:style/TextAppearance.StatusBar.EventContent.Title" /> <style name="NotificationContent" parent="@android:style/TextAppearance.StatusBar.EventContent" /> </resources> 

    Esta respuesta describe un método hacky de cambiar el color de fondo de la notificación.
    Preste atención: esta es una solución indocumentada ; Se basa en la reflexión y se puede romper en los firmwares personalizados; Es aplicable solo a las versiones Android Lollipop y Marshmallow; No funcionará en Android N y versiones superiores. Yo recomendaría a seguir con el color por defecto a menos que tenga una razón seria para evitarlo.

    POR QUÉ
    No hay forma legal de establecer un color de fondo para la notificación personalizada. Google decidió que las notificaciones deben ser de color blanco o gris claro dependiendo de su prioridad según el diseño del material . Sin embargo, Google también hizo dos excepciones a esta regla:

    1. Las notificaciones de aplicaciones anteriores se muestran con fondo negro;
    2. Las notificaciones creadas con MediaStyle pueden ser de CUALQUIER color.

    Como resultado de la segunda excepción, tal limitación parece ilógica e irracional, y esa es la única excusa posible por qué todavía desea utilizar un color personalizado en lugar de la que recomienda (o forzada?) De Google.

    QUÉ HAY ADENTRO
    Echemos un vistazo a BaseStatusBar para ver cómo se impone esta limitación. El único lugar donde se calcula el color de fondo para la notificación es el método applyColorsAndBackgrounds .
    La primera rama de la sentencia if es para aplicaciones heredadas. La única manera de llegar aquí es establecer el SDK de destino de su aplicación debajo de Build.VERSION_CODES.LOLLIPOP . El fondo se volverá negro en este caso.
    Estamos interesados ​​en la declaración entry.row.setTintColor . Para alcanzarlo, se deben pasar varias comprobaciones, incluida la contenida en el método isMediaNotification . Aquí están:

    1. La notificación debe contener vistas regulares y grandes.
    2. El diseño de nivel superior en ambas vistas debe tener com.android.internal.R.id.status_bar_latest_event_content como su ID.
    3. El diseño grande debe contener un widget con com.android.internal.R.id.media_actions como su ID.

    CÓMO
    Los más problemáticos son los identificadores siempre y cuando se declaren en los recursos internos y no se pueda acceder desde el XML de la aplicación.
    El segundo problema es que las RemoteViews utilizadas en la notificación son sólo un ID del recurso de diseño dentro de la aplicación y no se pueden construir en el código. Como resultado, no podemos agregar diseños con identificaciones necesarias para pasar todas las comprobaciones mencionadas anteriormente.

    Sin embargo, Google agregó los métodos addView y removeAllViews a RemoteViews para sus necesidades (se utilizan en la notificación de MediaStyle ) y se olvidó de hacerlos privados.

    Por lo tanto, la idea final es simple:

    • Construir la notificación basada en el diseño interno definido por Google (para pasar el segundo cheque)
    • Eliminar todo con removeAllViews
    • Agregue nuestro diseño personalizado con addView
    • Caso especial para la vista grande: agregue la disposición definida por Google que contiene media_actions a la vista invisible dentro de nuestra disposición de encargo (pasar la 3ro comprobación)

    Inconvenientes:

    • Inflando vistas no utilizadas (se quitan inmediatamente después de inflar)
    • Jerarquía de diseño complicada y más profunda

    SOLUCIÓN
    Nuestra vista personalizada debe contener FrameLayout con android.R.id.empty como su ID. En realidad, cualquier ID se puede utilizar aquí, sólo asegúrese de hacer referencia a la misma ID en el código (véase más adelante).

     // We need theese ids to use internal Android resources int topId = Resources.getSystem().getIdentifier("status_bar_latest_event_content", "id", "android"); int topBigLayout = Resources.getSystem().getIdentifier("notification_template_material_big_media_narrow", "layout", "android"); int topSmallLayout = Resources.getSystem().getIdentifier("notification_template_material_media", "layout", "android"); RemoteViews viewSmall = ...; // Create our custom view here RemoteViews viewBig = ...; // Create our custom big view here // This is invisible inner view - to have media_actions in hierarchy RemoteViews innerTopView = new RemoteViews("android", topBigLayout); viewBig.addView(android.R.id.empty, innerTopView); // This should be on top - we need status_bar_latest_event_content as top layout RemoteViews topBigView = new RemoteViews("android", topBigLayout); topBigView.removeAllViews(topId); topBigView.addView(topId, viewBig); // This should be on top - we need status_bar_latest_event_content as top layout RemoteViews topSmallView = new RemoteViews("android", topSmallLayout); topSmallView.removeAllViews(topId); topSmallView.addView(topId, viewSmall); Notification.Builder builder = new Notification.Builder(this); builder.setSmallIcon(R.drawable.ic_notification) .setTicker("Some text") .setColor(0xff000000) // The desired color! .setContent(topSmallView); Notification n = builder.build(); n.bigContentView = topBigView; // Use our notification "n" here as usual 

    Es posible utilizar otro diseño en lugar de notification_template_material_big_media_narrow en el nivel superior para manipular la altura de la vista grande. Busque uno apropiado entre los archivos notification_template_xxx.xml. Pero no se olvide de poner media_actions en la jerarquía.

    Este es el comportamiento correcto de la notificación.

    Si desea tener un control directo sobre este aspecto, le sugiero que haga lo siguiente:

    • Crear una versión alternativa de layout_message_notification.xml dentro de la carpeta res/layout-v21

    • Hacer un ligero cambio en esta nueva versión cambiando el color de fondo del diseño exterior:

     <?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/gray"> //... 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.