夜晚的故事(android夜間模式實現(xiàn))

夜幕降臨憔涉,他走在馬路上,回想著今天發(fā)生的一切析苫,他不敢相信事情就這樣發(fā)生了兜叨。他最終還是決定撥打那個電話,掏出手機衩侥,解鎖屏幕国旷,突然一道強光從屏幕里毫無預兆的發(fā)射出來。他一個踉蹌倒在了馬路中央茫死。而他身后伴隨著的是一陣刺耳的剎車聲跪但。

手機被摔在一邊,屏幕停留在撥號頁面峦萎,白茫茫的頁面屡久。很顯然,所謂的強光就是亮白的頁面爱榔,這種頁面在大晚上被打開被环,眼睛會很不適應,所以
.
.
.
.
.
.
我們來探討一下夜間模式详幽。

問: android夜間模式的實現(xiàn)有幾種筛欢?

答: 有好多種。(:◎)≡

  • apk文件

首先我想到的是唇聘,通過下載額外的apk文件版姑,然后在獲取該apk文件中的資源文件,然后替換之迟郎。當然這種方式就不僅限于夜間模式了剥险,可以有各種模式,也就是更換主題了宪肖。采用這種方式的表制,我猜有健爬,微博和QQ。(:◎)≡

想要了解夫凸,可以參考http://www.eoeandroid.com/thread-102060-1-1.html

  • 自定義View

把所有用到的view全部自定義一套浑劳,根據(jù)color和drawable命名規(guī)范,比如加_night后綴夭拌。根據(jù)當前設置的日夜間模式魔熏,在onDraw之前獲取對應的color或者drawable,然后再進行繪制鸽扁。采用這種方式的蒜绽,我猜有,網(wǎng)易新聞桶现。(:)≡

  • setTheme設置style

這種方式躲雅,也是我在之前項目中采取的方式÷夂停可以感受一下相赁。
采用這種方式,你需要這樣
(colors.xml)

<color name="color_a">#ffffff</color>
<color name="color_a_night">#000000</color>

然后這樣
(attrs.xml)

<attr name="colorA" format="color"/>

再這樣
(styles.xml)

<style name="Theme.A">
     <item name="colorA">@color/color_a</item>
</style>
<style name="Theme.A.Night">
     <item name="colorA">@color/color_a_night</item>
</style>

這樣
(activity_xxx.xml)

 <View 
        android:id="@+id/xxx"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="?attr/colorA"/>

如果此處你設置的background是一個drawable文件慰于,你需要創(chuàng)建兩個drawable文件(一個日間文件钮科,一個帶_night的夜間文件)。如果你>的這個drawable文件是個<selector> </selector>婆赠,不好意思绵脯,根據(jù)其中<item> </item>的種類數(shù)量,你的每種<item> </item>需要再double一份休里。

最后再這樣
(xxxActivity.java)

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ...
    if(!isNightMode()) { 
        setTheme(R.style.Theme_A); 
    } else {
        setTheme(R.style.Theme_A_Night); 
    }
    setContentView(R.layout.activity_xxx);
    ...
 }

如果需要切換日夜間蛆挫,先保存切換的模式,然后通過recreate()重啟activity

如果需要在代碼中去進行顏色設置妙黍,你可以這樣

     int[] attrs = { R.attr.colorA };
     TypedArray ta = context.getTheme().obtainStyledAttributes(attrs);
     int color = ta.getColor(ArrayUtils.indexOf(attrs, R.attr.colorA), 0);
     ta.recycle();
     textView.setTextColor(color);

基本的流程就是這樣悴侵。不管你受沒受夠,反正我受夠了废境。我就感覺自己挖了一個坑畜挨,當color和drawable越來越多,我就越陷越深噩凹,這是什么樣的一種感受,沒錯毡咏,就是絕望驮宴。

  • NightModeHelper

這種方式離我即將要說的方式越來越近了,你僅需要在res目錄下呕缭,再創(chuàng)建一個帶-night后綴的values文件夾values-night堵泽,再創(chuàng)建一個colors.xml文件修己,然后創(chuàng)建顏色<colorname="color_a">#000000</color>,注意迎罗,這里顏色命名不用添加_night后綴睬愤,與values文件夾中的顏色命名相同即可,只是這里的色值需要更換成夜間的纹安。
然后在xxxActivity.java

private NightModeHelper mNightModeHelper;

 @Override 
protected void onCreate(Bundle savedInstanceState) { 
    ...
    mNightModeHelper = new NightModeHelper(this, R.style.Theme_A);
    setContentView(R.layout.activity_xxx);
    ...
 }

 ...
//需要切換的地方調(diào)用該方法
mNightModeHelper.toggle();
...

NightModeHelper在這里https://gist.github.com/slightfoot/c508cdc8828a478572e0

這樣就成功了尤辱,節(jié)省了很多繁冗的步驟。曾經(jīng)我一度以為這是我最后的救命稻草厢岂,直到我遇到了她光督。。塔粒。

  • AppCompatDelegate

  • AppCompatDelegate

  • AppCompatDelegate

重要的事情說三遍结借!恩,就是這個家伙卒茬,不知道什么時候(我是使用的是v23.2.0 Support包)船老,這個家伙里面有了一個這個方法setDefaultNightMode(xxx)。這個方法可以設置四個值:

  • MODE_NIGHT_NO 日間模式
  • MODE_NIGHT_YES 夜間模式
  • MODE_NIGHT_AUTO 根據(jù)時間自動切換日夜間模式
  • MODE_NIGHT_FOLLOW_SYSTEM 默認模式圃酵,就是跟隨系統(tǒng)的設置柳畔,據(jù)說有可能以后會在android系統(tǒng)設置中添加日夜間模式的設置,此時如果你的app是默認模式辜昵,會根據(jù)系統(tǒng)設置變化日夜間模式
怎么用這個方法呢荸镊?

只要你的activity繼承AppCompatActivity,app的sdk最低版本在14以上堪置,你在任何地方都可以調(diào)用AppCompatDelegate.setDefaultNightMode(xxx)躬存,因為這是個靜態(tài)方法,設置完之后新開啟的頁面舀锨,都會采用新的模式岭洲。你需要在每次切換模式之后,把當前模式保存在本地坎匿,然后在下次打開app的時候盾剩,獲取當前模式并調(diào)用這個方法設置一下,就可以使app保持之前的模式替蔬。

接下來怎么去自定義自己的日夜間模式呢告私?

方法與之前的NightModeHelper類似,創(chuàng)建帶-night后綴的文件夾(比如:values-night)承桥,然后添加你的資源文件驻粟,資源文件需要相同的命名(比如:colors.xml),這樣就把夜間資源和日間資源關聯(lián)起來了凶异。這里注意一下蜀撑,如果是drawable-xxhdpi中的資源需要夜間模式挤巡,這些夜間的資源就應該放在drawable-night-xxhdpi文件夾中。這里其實靈活性很大的酷麦,比如你可以在values-night中創(chuàng)建一個strings.xml矿卑,實現(xiàn)日夜間顯示不同的文本。甚至你可以在layout-night中創(chuàng)建一個同樣名字的布局文件沃饶,實現(xiàn)日夜間顯示不同的布局母廷。

官方為了方便開發(fā)者,在最新的v23.2.0 Support包增加了一個Theme.AppCompat.DayNight主題绍坝,如果繼承這個主題徘意,會有一些配置好的屬性,如果你喜歡官方的配色轩褐,可以考慮繼承這個主題椎咧,也會省下不少功夫。

還有什么把介?

還有個方法也提一下勤讽,就是setLocalNightMode(xxx),同樣可以設置上述提到的四個值拗踢。但是這個方法只能通過getDelegate().setLocalNightMode(xxx)調(diào)用脚牍,這個方法只對當前activity有效果,并且設置完之后需要recreate()才能使其生效巢墅。

完了沒诸狭?

還沒完,夜間模式還有個讓人頭疼的問題就是君纫,當前頁面和已經(jīng)開啟的頁面的實時更新驯遇。之前說的這么多夜間模式方案,都是讓之后新的頁面獲取新的資源蓄髓,而舊的頁面怎么辦叉庐?

  • 如果你的頁面不是很復雜,那就把所有的View再重新設置一遍顏色或者圖片会喝《傅可以直接setTextColor(R.color.xxx) setBackground(R.drawable.xxx)。也可以自定View肢执,重新獲取一下資源文件再設置一下枉阵。這里還有個前提是,需要更新的activity都得調(diào)用getDelegate().setLocalNightMode(xxx)而不是AppCompatDelegate.setDefaultNightMode(xxx)预茄,因為后者只是更改了一個全局變量岭妖,所以并不會使資源文件立即變化。

  • 如果你的頁面很復雜反璃,那就
    .
    .
    .
    .
    .
    .
    recreate()吧昵慌!(:◎)≡(如果你有好的方案,也特別希望你能告知我一下;打凇)

他沒辦法起身斋攀,強忍著疼痛,挪動這身體梧田,緩緩的拿起手機淳蔼。從車上走出來的司機,就在一旁目睹這一切裁眯,心想鹉梨,這年頭碰瓷越來越有水平了。顫巍巍的雙手觸摸著手機屏幕穿稳,他最終還是撥打了那個號碼存皂,110。司機越來越看不明白逢艘,只感覺這套路很深
.
.
.
.
.
.
“喂旦袋!是110嗎?我鑰匙丟家里了它改,你能找人幫忙開一下嗎疤孕?”

(最后很感謝這篇分享AppCompat v23.2?—?DayNight

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市央拖,隨后出現(xiàn)的幾起案子祭阀,更是在濱河造成了極大的恐慌,老刑警劉巖鲜戒,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件专控,死亡現(xiàn)場離奇詭異,居然都是意外死亡袍啡,警方通過查閱死者的電腦和手機踩官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來境输,“玉大人蔗牡,你說我怎么就攤上這事⌒崞剩” “怎么了辩越?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長信粮。 經(jīng)常有香客問我黔攒,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任督惰,我火速辦了婚禮不傅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赏胚。我一直安慰自己访娶,他們只是感情好,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布觉阅。 她就那樣靜靜地躺著崖疤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪典勇。 梳的紋絲不亂的頭發(fā)上劫哼,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機與錄音割笙,去河邊找鬼权烧。 笑死,一個胖子當著我的面吹牛咳蔚,可吹牛的內(nèi)容都是我干的豪嚎。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼谈火,長吁一口氣:“原來是場噩夢啊……” “哼侈询!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糯耍,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤扔字,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后温技,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體革为,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年舵鳞,在試婚紗的時候發(fā)現(xiàn)自己被綠了震檩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜓堕,死狀恐怖抛虏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情套才,我是刑警寧澤迂猴,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站背伴,受9級特大地震影響沸毁,放射性物質(zhì)發(fā)生泄漏峰髓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一息尺、第九天 我趴在偏房一處隱蔽的房頂上張望携兵。 院中可真熱鬧,春花似錦掷倔、人聲如沸眉孩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巴柿,卻和暖如春凛虽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背广恢。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工凯旋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钉迷。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓至非,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糠聪。 傳聞我的和親對象是個殘疾皇子荒椭,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,318評論 25 707
  • 前言 由于項目需要,近段時間開發(fā)的夜間模式功能舰蟆。主流的方案如下:1趣惠、通過切換theme實現(xiàn)2、通過resource...
    三十二蟬閱讀 14,193評論 8 87
  • 前言 隨著一款APP應用功能的不斷完善身害,用戶群體的不斷增多味悄,APP的更新也就不僅僅局限于功能需求,如何做好良好的用...
    采蘑菇的里奧馬閱讀 27,904評論 43 146
  • 博文出處:對于Android日夜間模式實現(xiàn)的探討塌鸯,歡迎大家關注我的博客侍瑟,謝謝!0x0001====== 關于 An...
    俞其榮閱讀 10,580評論 16 74
  • 男生在咖啡店的沙發(fā)上臥著丙猬,這正是小島的午睡時刻涨颜。透過玻璃窗發(fā)現(xiàn),少年時動心過的車馬慢和書信慢淮悼,其實是跟著正午的艷陽...
    子回閱讀 520評論 0 1