編輯:Android資訊
夜間模式其實屬於多主題切換的一種,不過是最麻煩的一種。因為在夜間模式下不僅要切換主色調,次要色調等等,還要覆蓋一些特殊的顏色,因為在夜間模式下總不能什麼都是黑的把,那不得丑死-。-,所以當你夜間模式完成後,你的App對於日後多主題的擴展就可以輕松勝任了。
多數App由於歷史原因當對其進行夜間模式的功能改造時,工作量是比較大的,所以在真正開始著手實現前,我們還是應該先明確夜間模式(多主題)到底有多少實現的思路以及它們的優劣,這樣才可以有效的避免項目延期的情況出現。
自定義attr屬性。
這是最基礎的方法,就是通過自定義attr屬性,在不同的theme中進行不同的實現,然後在layout和style中調用。這種方法改代碼改動量比較大,而且根據不同的主題,drawable(5.0以上不用),selector等xml文件必須要相應的定義多份,因為 android由於兼容性和自身的原因並不能在這些文件中識別attr屬性(會報type解析錯誤),當然style和theme可以直接識別使用。
在shape,selector中不識別attr屬性我個人覺得可能是android的bug,因為5.0以上的drawable中是可以識別attr屬性的,所以理論上是可行的。若能解決在selector等xml中的識別問題,該方法就能大大減少重復代碼了。
重寫getResource方法
這是第三方微博客戶端Fuubo所采用的方式。重新Acticity和Application的getResource方法,統一同一顏色的是調用名字,對於不同主題在getRsource中進行判斷並返回對應的顏色值。
這樣做的好處是你不用定義很多份的drawable,selector之類的xml文件,你的所有顏色都將在getRsource中通過R.color中判斷並替換,省去很多工作,而且基本可以不改動你以前的代碼。
當然壞處也是顯而易見的,當你的App復雜時所有的替換邏輯都集中在getRsource()中將會顯得十分的臃腫,並且你無法使用theme中的系統屬性,因為theme中的屬性並不是通過Activity的getResource()進行加載的,所以例如系統的popMenu就無法改變其背景色等屬性,都需要你自定義實現了。
談到夜間模式或多主題切換,就不得不說另一個問題主題的切換方式。
重啟Activity。
這是最常用的切換方式,也是最暴力的解決方式,哈哈。
當然需要注意的是一定要在 super.onCreate(savedInstanceState);之前調用,不然會發生很多的意外問題-,- 。
至於重啟的方式有很多,可以直接Intent.FLAG_ACTIVITY_CLEAR_TOP,再啟動一個新的 Activity。或者finish自己再重新startActivity,或者最簡單的直接調用onRecreate()即可(相當於發生了 configuration change),然後再加上一個過渡的動畫效果,這就根據自己App的情況自行選擇了。
刷新所有控件。
其實現的思路是在自定義屬性的基礎上,再自定義每個控件,並將與主題顏色相關的屬性全部封裝在控件中,然後通過一個統一的接口,每當主題發生改變時,對當前Activity從根View開始進行遞歸遍歷刷新,而對於listview則是清空RecycleBin中的所有child view,這樣就等於是強行刷新了整個listview。
這種方式最大的優點就是可以不重啟Activity就可以更換Activity的主題顏色,大大優化了用戶的體驗。當然缺點也很明顯,因為如果你的App不是一開始就這麼做,那麼改造的工作量更加巨大(因為還要實現自定義屬性=。=)。
目前github已有人實現了這種思路的換主題框架, 傳送門 。
上面並沒有討論換主題的另一個方向:換膚。因為個人覺得簡單換膚其實與換主題色的區別並不是特別大,只需要添加換膚apk的下載,並將其資源加載到app中替換即可,網上有很多的實現思路,再這就不在傫述。而對於復雜的換膚,即如天天動聽一樣不僅可以更換主題顏色,資源文件,還可以更換 Layout布局!這。。。增加的工作量就不是多一點點的問題了(和以上討論的情況相比),所以暫不討論-。-。
以上是關於Android切換主題的一點心得,希望對您有些許幫助,有不正確的地方歡迎指出討論,如果您有其他的一些實現思路,也歡迎補充,謝謝。
前言 最近研究Android推送的實現, 研究了兩天一夜, 有了一點收獲, 寫下來既為了分享, 也為了吐槽. 需要說明的是有些東西偏底層硬件和通信行業, 我對這些
本篇博客要給大家分享的一個關於Android應用換膚的Demo,大家可以到我的github去下載demo,以後博文涉及到的代碼均會上傳到github中統一管理。
Microsoft 本周發布了 Visual Studio 2015 預覽版, 裡面包含 Android 開發工具. 安裝的時候, 如果選 Android 開發,
最近越來越多的人開始談論架構。我周圍的同事和工程師也是如此。盡管我還不是特別深入理解MVP和DDD,但是我們的新項目還是決定通過MVP來構建。 這篇文章是我通過研