Android自定義Notification的一些坑

第一次在簡(jiǎn)書發(fā)文章,有問(wèn)題多指教

本篇介紹自定義通知樣式時(shí)會(huì)遇到的一些坑,本篇旨在記錄坑,而不在全面講解自定義的方法

  • 文字顏色:強(qiáng)烈使用系統(tǒng)定義的文字顏色,否則需要固定背景色
  • 自定義View的尺寸: 建議自適應(yīng),因?yàn)椴煌到y(tǒng)高度會(huì)有差別
  • 不同系統(tǒng)版本的兼容性處理

詳細(xì)講解

文字顏色

首先一個(gè)大前提,通知欄的背景色的顏色是不確定的,有深色,也有淺色。
這里分兩種情況說(shuō)明。
一種是自定義布局的背景色固定,這種情況下可以直接指定文字顏色。但是這種在通知欄的觀感不是很好,比如淺色通知欄,顯示一條黑色通知顯得很突兀,也不好看。

第二種是透明背景色,這時(shí)文字顏色就不能固定了,好在系統(tǒng)提供的對(duì)應(yīng)的文字樣式。

原生系統(tǒng)提供了通知欄的適配樣式,這個(gè)樣式會(huì)保證在通知欄的文字顏色一直是正??梢?jiàn)的。

某些定制系統(tǒng)使用了系統(tǒng)提供的樣式還是會(huì)有問(wèn)題,比如小米6.0的某個(gè)版本。其他定制系統(tǒng)也類似,后面有詳細(xì)討論

下面先說(shuō)下如何使用系統(tǒng)樣式來(lái)適配

由于5.0引入MeterialDesign,5.0及以上的樣式命名有所更改,所以需要分別設(shè)置。

SDK21以下

values/style.xml

標(biāo)題樣式

android:textAppearance="@android:style/TextAppearance.StatusBar.EventContent.Title"

文字顏色:

android:textAppearance="@android:style/TextAppearance.StatusBar.EventContent"

SDK21及以上

標(biāo)題顏色

android:textAppearance="@android:style/TextAppearance.Material.Notification.Title"

內(nèi)容顏色

android:textAppearance="@android:style/TextAppearance.Material.Notification.Info"

注意:

上面的解決方案在實(shí)際使用中發(fā)現(xiàn)小米的6.0MRA58K版本是暗色通知欄,會(huì)導(dǎo)致顏色適配失效,經(jīng)研究此版本系統(tǒng)樣式采用的仍然是21以下的樣式配置。 這就造成小米和原生系統(tǒng)的適配沖突。

最終經(jīng)過(guò)研究有以下方案可以解決

  • 1,為小米手機(jī)做適配,單獨(dú)寫一套小米的適配樣式布局。通過(guò)判斷手機(jī)型號(hào)來(lái)適配,但是有個(gè)比較大的缺點(diǎn)就是如果其他系統(tǒng)也有類似問(wèn)題那么需要長(zhǎng)時(shí)間收集各種機(jī)型增加判斷條件來(lái)適配。這一個(gè)積累工作,長(zhǎng)期勞心勞神
  • 2,直接不設(shè)置文字顏色,這樣的適應(yīng)性會(huì)比較廣一些,但是在小米手機(jī)上對(duì)某些奇葩一點(diǎn)的主題也可能會(huì)導(dǎo)致文字與背景同色
  • 3,再就是上面說(shuō)的設(shè)置固定的背景色,不過(guò)據(jù)網(wǎng)上了解有些系統(tǒng)也會(huì)忽略自定義的背景色,這個(gè)倒是可以通過(guò)圖片來(lái)解決,詳細(xì)的就沒(méi)做深入探究。

我能說(shuō)最終還是選擇了不設(shè)置文字顏色來(lái)解決的么...吐槽一下定制系統(tǒng)。

自定義View的尺寸

首先Android原生系統(tǒng)中定義的樣式大致有兩種,一是普通通知,另一種是4.1以后引入的擴(kuò)展通知
普通通知高度為64dp,擴(kuò)展通知高度為256dp。但是由于國(guó)內(nèi)不同定制系統(tǒng)對(duì)這兩種高度有不同處理,所以推薦使用自適應(yīng)的布局,盡量不要固定寬高。
至于通知的寬度,不只受屏幕寬度影響,也受自制系統(tǒng)影響。比如華為系統(tǒng)的通知左側(cè)會(huì)有時(shí)間軸、小米和魅族系統(tǒng)左右會(huì)預(yù)留padding空間等等。

所以尺寸上盡量做到自適應(yīng)。

不同系統(tǒng)版本的兼容

擴(kuò)展布局只支持4.1以上系統(tǒng),對(duì)于4.1以下,可以只設(shè)置普通視圖的布局。
對(duì)于7.0以上系統(tǒng)一定不要直接使用notification.bigContentView來(lái)設(shè)置布局,此方法早已廢棄,尤其7.0以后bigContentView可能為空值

一些代碼細(xì)節(jié)

  • 創(chuàng)建通知可以使用v4包中的NotificatoinCompat.Builder,以兼容11以下版本。
  • 設(shè)置自定義布局推薦同時(shí)設(shè)置普通狀態(tài)和擴(kuò)展?fàn)顟B(tài)的布局,否則有些手機(jī)會(huì)出現(xiàn) Bad Notification Exception
builder.setCustomContentView(buildNormalView(pushMessage));
builder.setCustomBigContentView(buildNoImgView(pushMessage));

Android系統(tǒng)提供的富媒體樣式

上面說(shuō)的都是自定義樣式,這里順便提一下系統(tǒng)目前提供的樣式。

在4.1以下,只有標(biāo)準(zhǔn)模式,就是包含圖標(biāo)、標(biāo)題、文字的基本樣式。

4.1及以上增加了擴(kuò)展視圖,提供了BigText,BigImage兩種樣式

  • BigText: 在原有標(biāo)準(zhǔn)樣式的基礎(chǔ)上增大了內(nèi)容文字的區(qū)域,可以容納大量文字
  • BigImg: 在原有基礎(chǔ)上擴(kuò)展開(kāi)之后會(huì)將圖標(biāo)展示為大圖的樣式

詳細(xì)可以參考Google Notification Design

我的博客: www.xkjchen.com

參考:
Google Notification API
Google Notification Design

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,346評(píng)論 25 708
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 47,183評(píng)論 22 665
  • 原文出處: http://www.androidchina.net/6174.html Notification在...
    木木00閱讀 12,552評(píng)論 3 32
  • 踏上尋夢(mèng)的征途 我渴望前進(jìn) 我盼望成長(zhǎng) 我知道 路途坎坷難忘 但我依然自由翱翔 或許 這艱苦的經(jīng)歷 帶給我人生的仰望
    憶夢(mèng)女孩閱讀 166評(píng)論 0 0
  • 對(duì)于團(tuán)隊(duì)中需要清除的人需要及早行動(dòng),拖著是對(duì)雙方的不負(fù)責(zé)任,該做的決定要及早做。
    樓小樓_elf閱讀 242評(píng)論 0 0

友情鏈接更多精彩內(nèi)容