AndroidChangeSkin是鴻洋開源的一個換膚框架,喜歡的可以去Star下。
簡介
AndroidChangeSkin是一種完全無侵入的換膚方式,支援外掛式和應用內,無需重啟Activity。
使用換膚效果圖
預設:
換膚:
配置環境:
1、在app下的build.gradle
新增compile 'com.zhy:changeskin:4.0.2'
依賴即可。
2、或者下載changeskin,作為module依賴至主專案,例如:
dependencies { compile project(':changeskin') }
複製程式碼
使用:
1、在Application初始化
public class MyApplication extends Application
{
private static Context mContext;
@Override
public void onCreate()
{
super.onCreate();
mContext = getApplicationContext();
SkinManager.getInstance().init(this);
}
public static Context getContext()
{
return mContext;
}
}
複製程式碼
2、在attrs.xml
定義資源:
<!-- changeskin 預設 -->
<color name="menu_item_text_color">#ffffffff</color>
<color name="item_text_color">#ff000000</color>
<color name="main_bg">#fffffffe</color>
<!--應用內換膚資源-->
<color name="item_text_color_red">#ff0000</color>
<color name="menu_item_text_color_red">#ff0000</color>
<color name="main_bg_red">#ff0000</color>
<color name="item_text_color_yellow">#E8BF6A</color>
<color name="menu_item_text_color_yellow">#E8BF6A</color>
<color name="main_bg_yellow">#E8BF6A</color>
<color name="item_text_color_green">#00ff00</color>
<color name="menu_item_text_color_green">#00ff00</color>
<color name="main_bg_green">#00ff00</color>
複製程式碼
3、activity_main.xml
使用時新增 android:tag
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:tag="skin:main_bg:background"
tools:context="com.lwj.mytestpro.MainActivity">
<!--android:tag="skin:main_bg:background"-->
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button13"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:tag="skin:item_text_color:textColor"
android:text="換膚"/>
<Button
android:id="@+id/button14"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:tag="skin:item_text_color:textColor"
android:text="恢復預設膚色"/>
</LinearLayout>
</ScrollView>
</RelativeLayout>
複製程式碼
GitHub中該專案對tag的使用介紹如下:
tag屬性分為3部分組成:
skin
資源的名稱,即外掛包中資源的名稱,需要與當前app內使用的資源名稱一致。
支援的屬性,目前支援src,background,textColor,支援擴充套件。
3部分,必須以:分隔拼接。
對於一個View多個屬性需要換膚的,android:tag="skin:item_text_color:textColor|skin:icon:src" 同樣使用|進行分隔。
簡言之:如果你哪個View需要換膚,就新增tag屬性,tag值按照上述方式設定即可。
複製程式碼
4、應用內換膚
MainActivity:
public class MainActivity extends AppCompatActivity
{
private Button skin;
private Button defultSkin;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
SkinManager.getInstance().register(this);
setContentView(R.layout.activity_main);
Utils.init(this);
initView();
}
private void initView()
{
//換膚
skin = (Button)this.findViewById(R.id.button13);
skin.setOnClickListener(mOnClickListener);
defultSkin = (Button)this.findViewById(R.id.button14);
defultSkin.setOnClickListener(mOnClickListener);
}
private View.OnClickListener mOnClickListener = new View.OnClickListener()
{
@Override
public void onClick(View view)
{
switch(view.getId()){
case R.id.button13:
SkinManager.getInstance().changeSkin("yellow");
break;
case R.id.button14:
SkinManager.getInstance().removeAnySkin();
break;
default:
break;
}
}
};
@Override
protected void onDestroy()
{
Toast.makeText(this, "MainActivity.onDestroy", Toast.LENGTH_SHORT).show();
SkinManager.getInstance().unregister(this);
super.onDestroy();
}
}
複製程式碼
首先要在onCreate
呼叫register
註冊,在onDestroy
呼叫unregister
解註冊。使用SkinManager.getInstance().changeSkin("yellow")
即可完成換膚。
注意:這裡的changeSkin
傳入的是字串yellow
,跟我在attrs.xml
檔案定義屬性名字的字尾一致。
<color name="menu_item_text_color">#ffffffff</color>
<color name="item_text_color">#ff000000</color>
<color name="main_bg">#fffffffe</color>
<color name="item_text_color_yellow">#E8BF6A</color>
<color name="menu_item_text_color_yellow">#E8BF6A</color>
<color name="main_bg_yellow">#E8BF6A</color>
複製程式碼
關於AndroidChangeSkin
的使用,還可以參考這篇文章Android 夜間模式changeskin小結,這篇文章的好處是:對踩過的坑總結得不錯。