1.APK文件方式:(CM9方案)
優勢:代碼簡潔,可以使用android本土訪問資源的方式引用資源包裏的樣式如:R.id.XXX
缺點:需將資源包打成APK,非開發人員可能沒法完成該任務。
第一步:
新建 android工程theme_prj(爲樣式工程),package爲:
com.theme_prj 在theme_prj工程的drawable文件夾下放入back.png文件,而後安裝。
第二步:
新建 android工程main_prj(爲主工程,這裏的例子是主工程引用樣式工程裏的資源文件,以達到切換主題的效果),在main_prj文件夾中也放入back.png,注意 back.png與theme_prj工程裏的back.png只是名稱相同,是徹底不一樣的兩個圖片文件,一個爲黑色,一個爲白色。
第三步:
將main_prj的layout文件main.xml的背景顏色設置爲back.png ,假如 main.xml文件爲:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/layout"
android:background="@drawable/back"
>
<Button android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<LinearLayout />
第四步:
編寫MainActivity
this.setContentView(R.layout.main);
final LinearLayout layout= (LinearLayout) this.findViewById(R.id.layout);
Button btn = (Button) this.findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//獲取樣式工程的Context
Context app_theme = this.createPackageContext("
com.theme_prj",
Context.CONTEXT_IGNORE_SECURITY);
//獲取樣式工程資源
Resources res = app_theme.getResources();
//將樣式工程的資源設置爲背景圖
layout.setBackgroundDrawable(res.getDrawable(R.drawable.back));
}
});
2.讀取zip文件的方式:(高通方案)
優勢:非開發人員也能夠很輕鬆的完成資源包任務。
缺點:代碼比起APK方式相對比較繁瑣,須要考慮圖片文件完整、和一些異常等因素。這種方式有關問題就是每次須要讀取zip流,這樣性能太差,能夠考慮單例設計。
第一步:程序裏全部引用資源的地方改成讀路徑的方式,不使用android本土R.的方式。
第二步:完成資源所需的全部圖片文件和資源相關說明放在一個文件夾壓縮打包。
第三步:指定讀取資源壓縮包的相關約定協議,好比該主題名稱等信息以約定格式存儲。
第四步:程序讀取資源壓縮包約定格式的資源信息,加載。
3.讀取文件的方式:
優勢:性能較好,能夠更換theme,layout,xml等大部分文件,
缺點:每一個xml文件必須放在源碼中編譯後取其二進制文件。不便於大量使用和移植,還有個問題就是若是程序添加了新資源文件可能須要從新編譯。由於id可能發生了變化。
第一步:完成資源所需的全部圖片文件和資源相關說明放在一個文件夾。
第二步:程序裏全部引用資源的地方改成讀路徑的方式,不使用android本土R.的方式。
第三步:指定讀取資源文件的相關約定協議,好比該主題名稱等信息以約定格式存儲。
第四步:程序讀取資源壓縮包約定格式的資源信息,加載。
我還在研究如何實現到MIUI的效果,但願能實現修改全部的資源文件,不用編譯成二進制文件,不用修改每一個程序的代碼,只要修改好框架層,經過主題的狀態加載相關資源。而後將要修改的資源文件都放在某個文件夾下就能夠實現效果。這樣能夠便於大量移植,第三方人員也能很方便的修改主題。