android 切換主題介紹二

原文出自:Spring sky ,歡迎轉載,請保留版權和原文地址 http://blog.csdn.net/springsky_/article/details/24480289  

在這篇文章前,我寫過一篇以apk爲插件方式切換主題的文章,那麼當你的boss不接受安裝方式該怎麼辦?

下面,我將要介紹另外一種方式,就是把資源文件打包在主程序的方式,該方式的分析具體如下:

簡介:把主工程中,使用不同的style方式,去加載不同的資源文件(也許聽起來很模糊,下面會詳細介紹)

優點:速度快,效率高,不需要額外的安裝包,避免的安裝、下載等繁瑣的問題,不用修改java程序代碼,方便,快捷。

缺點:造成資源包很大,不適合版本控制,每次切換都需要重新OnCreate Activity。

下面,我們來介紹相關的關鍵技術:1.自定義我們的attr 對象: 自定義attr,首先需要在values的文件夾中創建一個attrs.xml文件,然後對相關的attr進行配置。這個簡單的介紹一下attr的意思,這個是自定義屬性的意思,主要用於自定義控件方面,同時我們可以自定義他爲皮膚的屬性名稱.

具體創建如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="page_bg" format="reference" />
    <attr name="btn_bg" format="reference" />

</resources>
上面就是我自定義兩個屬性,一個界面背景和一個按鈕背景

2.定義style主題定義主題這塊,目前網上很多文章,都寫得很簡潔,對於不熟悉的人來說,真心的看不懂,也不提供demo給初學者實踐,所以這點很容易讓那些意向不堅定的人否決了這種方式,那麼具體的應該是:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="Theme.Default" parent="@android:style/Theme.NoTitleBar.Fullscreen">
        <item name="page_bg">@drawable/page_bg</item>
        <item name="btn_bg">@drawable/btn_item_bg</item>
    </style>
    <!-- 夜色朦朧主題 -->
    <style name="Theme.Ysml" parent="@android:style/Theme.NoTitleBar.Fullscreen">
        <item name="page_bg">@drawable/ysml_page_bg</item>
        <item name="btn_bg">@drawable/ysml_btn_item_bg</item>
    </style>

</resources>
上面我定義了兩個主題: Theme.Default是默認主題 Theme.Ysml 是夜色朦朧的主題。

在兩個主題中,有兩個item,分辨是page_bg和btn_bg ,其實這裏的屬性,就是我們在上面定義的attr,這一點,網上的文章沒說清楚,導致了很多初學者不理解或者直接到這裏就提示錯誤。所以,筆者特別的提醒一下大家,希望能解決初學者心中的疑惑。

從page_bg和btn_bg中我都設置了他爲我們資源中的兩個圖片,其實這裏可以定義其他的類型,比如:@color @anim 。如果我們需要要做好一個項目,那麼就不能按照我這樣寫了,應該是定義額外的style 來引用,這裏就不做具體說明,思維很重要,只要你懂得去簡化程序,你就能明白。

3.怎麼使用我們的自定義屬性?如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?page_bg"
    android:gravity="center"
    android:orientation="vertical" >

    <Button
        android:id="@+id/set_default_theme"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?btn_bg"
        android:gravity="center"
        android:text="設置爲默認主題" />

    <Button
        android:id="@+id/set_ys_theme"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?btn_bg"
        android:gravity="center"
        android:text="設置爲夜色主題" />

</LinearLayout>
在這個layout中,我們的背景中使用了:”?page_bg“,這就是使用圖片資源了。當然,當你的屬性裏面定義的是color,也可以直接調用的,這裏就不多做解釋,舉一反三,多實踐吧同學們。

其實這算是一個隱式的引用關係,因爲我們不知道調用哪個主題的資源來顯示。那麼我們怎麼去告訴程序,我要顯示哪一個主題?4.調用主題?

目前有兩種使用主題的方式 No.1 在AndroidManifest.xml 中配置主題,對一個activity中設置它的:android:theme="" 屬性即可,可是,我們是爲了動態的調用主題方式,所以這種方式,顯然否決了!

No.2 在Activity中設置,方法:在Activity的onCreate方式中調用:setTheme(theme) 方法,特別注意,該方法必須在調用setContentView之前調用。這裏我再額外說兩句,如果我們寫一個BaseActivity的話,在onCreate中調用一下setTheme方法,那麼是不是會簡化我們的代碼?吐舌頭


那麼具體,就看看我們運行的效果:1.默認主題:


2.夜色朦朧主題:


總結:總體來說,該方式應該在很多公司容易接受,但是優缺點我也說了,可能每個人的想法不一致,呵呵,主要的是我們能熟悉懂得技術,需要的時候我們立馬解決問題就ok,對自己的提升也是一個不錯的實踐。如有疑問請聯繫我。


具體代碼:http://download.csdn.net/detail/vipa1888/7252141



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章