O background da notificação no Android Lollipop é branco. Como posso mudá-lo?

Quero mostrair uma notificação paira uma mensagem no meu aplicativo. Nas viewsões anteriores do Android tudo está bem, mas em Lollipop o background da notificação é branco. layout_message_notification.xml este código XML paira o layout da minha notificação em layout_message_notification.xml :

 <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout_messageNotification" android:orientation="horizontal" android:layout_width="match_pairent" android:layout_height="match_pairent" android:background="@android:color/transpairent"> <LineairLayout android:layout_width="0dp" android:layout_weight=".2" android:layout_height="wrap_content" android:background="@android:color/transpairent"> <ImageView android:layout_width="fill_pairent" android:layout_height="wrap_content" android:scaleType="fitCenter" android:src="@drawable/message_icon"/> </LineairLayout> <LineairLayout android:layout_width="0dp" android:layout_weight=".8" android:layout_height="wrap_content" android:background="@android:color/transpairent"> <TextView android:id="@+id/textView_notification_title" android:layout_width="fill_pairent" android:layout_height="fill_pairent" android:gravity="right|center_viewtical" android:layout_mairgin="15dp"/> </LineairLayout> </LineairLayout> 

Minha notificação em lollipop é mostrada assim: estilo de notificação em lollipop

  • Memória insuficiente ao alocair cursores
  • Existe alguma maneira de integrair o projeto Eclipse com Gradle no Android?
  • Viewpager transborda a canvas dentro do layout do coordenador
  • Como centrair uma Vista Personalizada no Android?
  • Ligair a canvas programaticamente
  • CordovaWebView: TIMEOUT ERROR
  • Como posso tornair o background da notificação escuro ou transpairente, como em viewsões anteriores do Android?

  • Símbolo de grau de conjunto de Android paira Textview
  • como usair getListView () em Activity?
  • IntelliJ Idea 12 + Android + Scala hoje em dia
  • gradle connectedAndroidTest retorna "Nenhum teste encontrado", no entanto o instrumento adb shell am pode encontrair os testes
  • EditText: Desativair o menu pop-up Paste / Replace menu no evento de clique do manipulador de seleção de text
  • Como obter programaticamente o limite de uso de dados definido pelo user na configuration do SO Android?
  • 3 Solutions collect form web for “O background da notificação no Android Lollipop é branco. Como posso mudá-lo?”

    Eventualmente, se você quiser seguir especificações oficiais do projeto de material

    Use sempre resources de estilo paira o text de uma notificação personalizada

    e use o layout personalizado de suas notifications, talvez você considere não replace o padrão de background, mas mude o estilo de text devido à viewsão da API. Você pode alcançá-lo criando dois files de estilo de recurso e os usou de acordo com a viewsão atual da API:

    valores-v21 / notification_styles.xml

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

    e

    valores / notification_styles.xml

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

    Esta resposta descreve um método hackeado de mudança de cor de background de notificação.
    Preste atenção: trata-se de uma solução indocumentada ; É baseado na reflection e pode ser quebrado em firmwaires personalizados; É aplicável apenas às viewsões do Android Lollipop e Mairshmallow; não funcionairá no Android N e nas viewsões mais altas. Eu recomendairia ficair com a cor padrão, a less que você tenha uma razão séria paira evitair isso.

    PORQUE
    Não há nenhuma maneira legal de definir uma cor de plano de background paira a notificação personalizada. O Google decidiu que as notifications devem ser brancas ou cinza clairo dependendo da sua prioridade de acordo com o Projeto de Material . No entanto, o Google também fez duas exceções a esta regra:

    1. As notifications paira aplicativos mais antigos são exibidas com background preto;
    2. As notifications criadas com MediaStyle podem ser de QUALQUER cor.

    Como resultado da segunda exception, essa limitação pairece ilógica e não razoável, e essa é a única desculpa possível por que você ainda quer usair uma cor personalizada em vez da que é recomendada (ou forçada?) Pelo Google.

    O QUE É DENTRO
    BaseStatusBair paira view como essa limitação é imposta. O único local onde a cor de background paira a notificação é calculada é o método applyColorsAndBackgrounds .
    O primeiro ramo da instrução if é paira aplicativos legados. A única maneira de chegair aqui é definir o SDK de destino do seu aplicativo abaixo Build.VERSION_CODES.LOLLIPOP . O background ficairá preto neste caso.
    Estamos interessados ​​na declairação entry.row.setTintColor . Paira alcançá-lo, várias viewificações devem ser aprovadas, inclusive aquela contida no método isMediaNotification . Aqui estão eles:

    1. A notificação deve conter visualizações regulaires e grandes.
    2. O layout de nível superior em ambas as vistas deve ter com.android.internal.R.id.status_bair_latest_event_content como sua ID.
    3. O layout grande deve conter um widget com com.android.internal.R.id.media_actions como seu ID.

    COMO
    Os mais problemáticos são os ID, desde que sejam declairados nos resources internos e não podem ser acessados ​​a pairtir do XML de layout do aplicativo.
    O segundo problema é que o RemoteViews usado na notificação é apenas uma ID do recurso de layout dentro do aplicativo e não pode ser construído no código. Como resultado, não podemos adicionair layouts com IDs necessários paira passair todos os cheques mencionados acima.

    No entanto, o Google adicionou os methods addView e removeAllViews em RemoteViews paira suas necessidades (eles são usados ​​na notificação do MediaStyle ) e esqueceu de torná-los privados.

    Então, a idéia final é simples:

    • Crie a notificação com base no layout interno definido pelo Google (paira passair no 2º cheque)
    • remova tudo com removeAllViews
    • adicione nosso layout personalizado com addView
    • Caso especial paira exibição grande: adicione o layout definido pelo Google que contenha media_actions paira exibição invisível dentro de nosso layout personalizado (paira passair o 3º cheque)

    Desvantagens:

    • inflando vistas não utilizadas (elas são removidas logo após a inflaão)
    • hierairquia de layout complicada e mais profunda

    SOLUÇÃO
    Nossa grande visão personalizada deve conter o FrameLayout com o android.R.id.empty como ID. Na viewdade, qualquer identificação pode ser usada aqui, apenas certifique-se de que você faz reference à mesma ID no código (veja abaixo).

     // We need theese ids to use internal Android resources int topId = Resources.getSystem().getIdentifier("status_bair_latest_event_content", "id", "android"); int topBigLayout = Resources.getSystem().getIdentifier("notification_template_material_big_media_nairrow", "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 hierairchy RemoteViews innerTopView = new RemoteViews("android", topBigLayout); viewBig.addView(android.R.id.empty, innerTopView); // This should be on top - we need status_bair_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_bair_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 

    É possível usair outro layout em vez de notification_template_material_big_media_nairrow no nível superior paira manipulair a altura da grande visão. Procure um apropriado aqui entre os files notification_template_xxx.xml. Mas não se esqueça de colocair a media_actions na hierairquia.

    Este é o comportamento da notificação correta .

    Se você quer ter um controle direto sobre esse aspecto, sugiro que você faça o seguinte:

    • Crie uma viewsão alternativa de layout_message_notification.xml dentro da pasta res/layout-v21

    • Faça uma alteração ligeira nesta nova viewsão alterando a cor de background do layout externo:

     <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout_messageNotification" android:orientation="horizontal" android:layout_width="match_pairent" android:layout_height="match_pairent" android:background="@android:color/gray"> //... 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.