Android 切換主題以及換膚的實現


Android 切換主題以及換膚的實現

一.介紹


現在市面上有很多 APP 有切換主題和皮膚的功能!特別是閱讀類的 APP!

圖片

圖片

上面兩張圖分別是 知乎 APP 和Fuubo APP的兩張截圖!都帶有切換主題的功能!!無疑,增加了這個功能可以是我們的 APP 有更好的用戶體驗!更風騷的展現方式!!好了,下面我就以我現在正在做的開源的 博客園 APP 為例,先為大家講解一下切換主題的功能!!

下面先來看張效果圖:
動態圖

二.思路以及實現

2.1 主題的切換以及實現


首先我們先來明確個概念,現在我所說的切換主題,就切換整個app的顏色風格,當然也有少部分的圖片的切換。注意哦 我這邊說的是少部分圖片哦!如果是大面積的換圖片的吧!那就不是切換主題了而是換膚了!好了,咱們言歸正傳。既然要切換主題,那首先我們得有多套主題。好了,那我們首先來定義兩套主題。直接看代碼

代碼

好了目前為止,我們已經准備好了主題了!但是,有些讀者可以能已經看到這是什么鬼?

 <item name="textLight">@android:color/white</item>
 <item name="appbg">@color/colorPrimaryDarkNight</item>
 <item name="textNight">@color/gray</item>

這三行是什么鬼!!他們並不是android自由的屬性!他們是我自定義的屬性!!要問有什么用?馬上告訴你!!

首先先來看下這三個屬性的代碼:
圖片
這就是三個屬性的定義啦!!
好啦!定義完之后,我們在xml的布局中就可以!要使用頂屬性只要在代碼中這么引用就行啦

android:background="?attr/appbg"

這樣背景色就自動轉換成了你設置的這個屬性值啦!現在我們要做的就是把要在更改主題的時候變換顏色的控件的背景色或者
字的顏色亦或其他...引用的屬性的值就好了!當讓這些值在定義Theme的時候要設置好!這里的自定義屬性的可控性比較大!隨
用戶自己弄!!!

現在還剩最后一個問題就是如何設置Theme啦!!!!那么又如何設置Theme了!!別急!activity 為我們提供了一個方法那就是 setTheme(int id) 方法!那有人就說啦!那好辦!只要在要設置的屬性的時候調用這個方法就行啦!我很遺憾的告訴你不行哦!這個要在 setContentView(int id) 之前調用!!!!!!!那怎吧呢!很簡單啊?就是重啟當前Activity就行啦!!現在我們還得處理一個問題:就是處理那些 “過時” 的 activity ! 我這里提供的方法是 清空我們的 back stack。
直接看代碼:
代碼

好了,現在就可以啦!!當然還是有細節要處理的!比如說在我的這個開源項目中:MainActivity-->SettingActity!也就是說 當我換主題之后 我的 MainActivity 也就 GG 了!!所以當我從這個頁面返回的時候 我是直接跳轉的這個 MainActivity中的!所以這個就會引發一個問題 就是當我 不設置主題的時候!我返回的時候,就會有兩個 MainActivity在棧中,所以現在就用到activity的啟動模式啦!我是用的 singleTask!!不了解的這個模式的童鞋!可以自行百度哦!!!

好了 切換Theme的講解就到此結束!!!

2.2 皮膚的切換


如果到了換膚的階段 就不適合用上面的方法啦!!因為你不可能在 APK 中放入很多套皮膚!這個會讓 APK 變的很大很大!得不償失呀!目前,我公司項目的做法是:從網絡端獲取皮膚壓縮包!!在本地 APK 中異步下載下來之后,解壓縮!得到一個文件包!里面的所有文件的名字和本地 APK 是一樣的!這時候很簡單啦!我們先保存個標志位--表示引用的是哪套皮膚就行啦!此時,我還用到了EventBus這個通信框架!在每個需要改變的皮膚的 Activity 中注冊EventBus! 當在設置發出通知后,每個頁面能做出更新!!這個思路!!還有一個比較就是有些控件的背景是是selector或者其他的!!這個就需要解析xml文件了!分別讀到與之對應的drawable文件之后在組合用的是這個類:StateListDrawable !注意到這點就行啦 !!其他的都很簡單了!!這塊我就不提供代碼啦!!!!

結束

最后還是希望大家 關注 / start 一下我博客園客戶端的開源項目 :

github地址

地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM