Android夜間模式實現,android夜間模式
查看我的全部開源項目【開源實驗室】
歡迎加入我的QQ群:【201055521】,本部落格用戶端下載【請點擊】
本文原創,轉載請註明地址:http://blog.kymjs.com/
最近在做一個Android夜間模式的功能,又重新研究了一下Theme機制。貫徹我的風格,以解決問題為目標,寫了個小Demo,簡單了實現了切換夜間模式,為大家講解。
在Activity中有一個方法叫setTheme(),可以設定Activity的Theme,當然Application類中也有相同的方法,也可以在Application中設定當前應用的Theme。就好像我們可以在Manifest檔案中通過android:theme=“”來設定主題一樣。
建立屬性名稱
在工程目錄res/values/下建立一個xml檔案,名字可以自訂,這裡我的叫theme_attr.xml 內容如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="text_bg" format="reference|color"/> <attr name="bottom_bg" format="reference|color"/> </resources>
其中text_bg和bottom_bg就是我們定義的兩個屬性名稱,後面的format是指的這個屬性名稱的類型,這裡我是用reference|color表示既可以是一個引用,也可以是一個argb顏色值。除了這些你還可以選擇int,boolan,string等資料類型。
定義資源樣式
建立完屬性名稱後就需要建立主題樣式了。依舊在res/values/下建立一個xml檔案,或者也可以在原style.xml中寫,是一樣的。這裡為了項目結構清晰,就單獨寫一個檔案叫theme_dark.xml 我們需要在這裡定義步驟一中定義的各屬性名稱在當前主題下的值。
<resources> <!-- Base application theme. --> <style name="DarkTheme" parent="@android:style/Theme"> <item name="text_bg">@drawable/selector_text_bg_dark</item> <item name="bottom_bg">@drawable/bg_bottombar_dark</item> </style> </resources>
這裡可以看到因為上面我屬性類型定義了引用或顏色,所以這裡的值我既可以傳@drawable類型的引用也可以直接賦值一個#ff00ff這樣的顏色值。
布局中使用
布局檔案中使用我們自訂的檔案時,需要添加一個問號來表示引用。例如
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/login_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?text_bg" android:text="登入"/> </LinearLayout>
這樣就表示我們的登入按鈕的背景使用的是前面定義的屬性名稱text_bg在當前主題下的值,也就是我們步驟二中定義的@drawable/selector_text_bg_dark這張圖片(其實是一個選取器了)
代碼中使用
以一個最簡單的例子來說明了,需要注意的是一定要在Activity的setContentView調用之前調用setTheme()方法。網上有很多介紹都說的是在super之前,其實這種說法並不準確。當我們動態切換主題時,例如點擊某個按鈕,切換主題,這個時候需要再次手動調用setContentView()方法,並重新調用控制項初始化以及監聽器設定。但是這裡告訴你一種簡單方法:直接手動調用recreate()方法,再次建立視圖就可以了。
public class UserInfor extends KJActivity { @BindView(id = R.id.logout_btn, click = true) private Button mBtnLogout; @Override public void setRootView() { setContentView(R.layout.activity_userinfor); } @Override public void widgetClick(View v) { super.widgetClick(v); switch (v.getId()) { case R.id.logout_btn: setTheme(R.style.DarkTheme); recreate(); break; } } }