第一次在簡(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