試著用鴻洋大神寫的SkinManager實現(xiàn)了換膚功能沥阱。
一伐憾、配置
在app下build.gradle中添加依賴:
//換膚功能
compile 'com.zhy:changeskin:4.0.2'
這樣就配置好了篙螟,然后在程序入口進行初始化芹扭。
二、全局初始化
在自己創(chuàng)建的繼承application的類中添加:
//換膚sdk初始化
SkinManager.getInstance().init(this);
這個類肯定要在清單文件<application/>節(jié)點配置的脓匿。
接下來還需要注冊淘钟。
三、注冊
在清單文件中添加權(quán)限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
在使用換膚功能的頁面onCreate()中注冊:
//換膚功能頁面注冊
SkinManager.getInstance().register(this);
有注冊當然有注銷啊陪毡,在onDestroy方法中取消注冊:
//換膚功能注銷
SkinManager.getInstance().unregister(this);
四米母、命名規(guī)則
1、SkinManager命名規(guī)則是:前綴 + “_” + 后綴毡琉;
2铁瞒、前綴、后綴的命名由開發(fā)者自行定義桅滋;
3慧耍、同屬性不同膚色前綴一樣,不同屬性前綴不一樣丐谋;
//例如:定義textColor屬性值為@color/skin_text芍碧,不同膚色color命名前綴均為skin_text
4、后綴根據(jù)膚色主題配置号俐,每個主題所有屬性后綴一樣泌豆;
//例如:膚色有黑色、白色兩種主題吏饿,如果黑白定義為“black”“white”踪危,
//那么不管是textColor還是background屬于黑色主題的后綴就是black,屬于白色主題的后綴就是white找岖。
五、膚色配置
1敛滋、在res/values/colors.xml中配置不同皮膚顏色:
<!--黑底白字(默認主題)-->
<color name="skin_text">#FFFFFF</color>
<!--黑底白字(黑色主題)-->
<color name="skin_text_black">#FFFFFF</color>
<!--白底黑字(白色主題)-->
<color name="skin_text_white">#000000</color>
2许布、在res/drawable下創(chuàng)建背景shape:
skin_bg.xml(默認主題)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#000000"/>
</shape>
skin_bg_black.xml(黑色主題)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#000000"/>
</shape>
skin_bg_white.xml(白色主題)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#FFFFFF"/>
</shape>
3、在src/drawable下導入不同主題圖片:
//圖片同樣以skin_src.png绎晃、skin_src_white.png蜜唾、skin_src_black.png命名
注意:這三種膚色配置非必須杂曲,1常用來配置textColor屬性、2常用來配置background屬性袁余、3常用來配置src屬性擎勘,根據(jù)項目需要自行設置
六、布局引用
布局中引用直接設置tag屬性颖榜。
textColor屬性設置:
<TextView
android:id="@+id/title"
style="@style/MatchWrap"
android:layout_marginTop="@dimen/dp_10"
android:gravity="center_horizontal"
android:tag="skin:skin_text:textColor"
android:text="測試文字"
android:textColor="@color/skin_text"
android:textSize="@dimen/sp_24" />
background屬性設置:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/skin_bg"
android:tag="skin:skin_bg:background">
src屬性設置:
<ImageView
style="@style/WrapWrap"
android:src="@drawable/skin_src"
android:tag="skin:skin_src:src"/>
注意:使用SkinManager棚饵,background屬性不支持@color設置,只能設置@drawable/...
七掩完、tag屬性
分為三部分:
第一部分skin是固定值噪漾,不可改變;
第二部分skin_text且蓬、skin_bg欣硼、skin_src是膚色配置前綴;
第三部分textColor恶阴、background诈胜、src是膚色配置對應的屬性;
此外冯事,tag屬性支持多屬性配置焦匈,用“|”分割,如:
<TextView
style="@style/MatchWrap"
android:layout_marginTop="@dimen/dp_10"
android:background="@drawable/skin_bg"
android:gravity="center_horizontal"
android:onClick="changeClick"
android:tag="skin:skin_text:textColor|skin:skin_bg:background"
android:text="測試文字"
android:textColor="@color/skin_text"
android:textSize="@dimen/sp_24" />
同時設置了textColor和background屬性桅咆。
注意:第二部分(skin_text)不必與對應屬性值(android:textColor)的命名(@color/skin_text)完全一致括授,這里是因為我設置的skin_text為默認主題,如果你設置skin_text_default為默認主題岩饼,tag配置不變荚虚,屬性值應為@color/skin_text_default
八、換膚代碼
以第七項中的TextView點擊事件實現(xiàn)換膚為布局籍茧,在頁面中:
//聲明成員變量版述,默認false,默認主題為黑色
private boolean isChange;
//實現(xiàn)設置點擊事件
public void changeClick(View view){
Log.e(TAG, "點擊改變");
isChange = !isChange;
if(isChange){
SkinManager.getInstance().changeSkin("white");
}else{
SkinManager.getInstance().changeSkin("black");
}
}
使用changeSkin("后綴")就實現(xiàn)了換膚功能;
如果要在彈窗中添加換膚功能寞冯,可以在彈窗布局添加換膚配置后渴析,頁面代碼中調(diào)用SkinManager.getInstance()的injectSkin(View view)方法實現(xiàn)。
final Dialog dialog_skin = new Dialog(activity, R.style.MyDialogTheme);
View contentView = View.inflate(activity, R.layout.dialog_skin, null);
//實現(xiàn)對話框換膚
SkinManager.getInstance().injectSkin(contentView);
DialogSkinBinding binding = DataBindingUtil.bind(contentView);
dialog_skin.setCanceledOnTouchOutside(true);
dialog_skin.show();
注意:SkinManager中添加有sp緩存功能吮龄,會將膚色配置后綴緩存起來俭茧,如果測試配置過程有問題,先清理下緩存再試漓帚。