这篇博客记录的是自己实现一个简单的换肤功能,效果图:
嗯,分三个步骤。
1) 自定义属性,然后在style里面写出两种style的属性值
attrs.xml里自定义属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="main_bg" format="reference|color" />
<attr name="main_textcolor" format="reference|color"/>
</resources>
然后style.xml里面定义两个主题。
<!--白天主题-->
<style name="dayTheme">
<item name="main_bg">#fff</item>
<item name="main_textcolor">#000</item>
</style>
<!--夜间主题-->
<style name="nightTheme">
<item name="main_bg">#1e1e2a</item>
<item name="main_textcolor">#666</item>
</style>
2)然后将属性用在需要更换主题的地方
我就以一个tabLayout为例
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMinWidth="80dp"
android:background="?attr/main_bg" //---------------用在这里------------
app:tabTextColor="?attr/main_textcolor" //------------和这里------------
app:tabMode="scrollable">
</android.support.design.widget.TabLayout>
3)点击更换主题按钮的响应逻辑。
我的是:点击白天主题,就在sharepreference 里面存一个标记0【假设0代表 白天,1代表夜间】
然后finish掉当前的Activity,重启activity,因为我在activity的onCreate方法中
会获取sharepreference里的值,如果取出为0,代表白天主题,然后setTheme(R.style.dayTheme)
//切换主题侦听
ll_change_theme.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final String[] choice = {"白天","黑夜"};
builder.setTitle("更换主题模式").setSingleChoiceItems(choice, mThemeTag, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(which==0){
SharePreUtil.setTheme(getActivity(),"0");
getActivity().finish();
}else {
SharePreUtil.setTheme(getActivity(),"1");
}
dialog.dismiss();
getActivity().finish(); //-----看这里
Intent intent = new Intent(getContext(),MainActivity.class);
startActivity(intent);
}
}).setNegativeButton("取消",null).show();
}
});
public static void setTheme(Context context,String tag)
{
SharedPreferences sp = context.getSharedPreferences(TAGNAME,Context.MODE_PRIVATE);
sp.edit().putString(THEMETAG,tag).commit();
}
themeTag = SharePreUtil.getThemeTag(this);
if(themeTag.equals("0")){
intThemeTag = 0;
setTheme(R.style.dayTheme);
}else{
intThemeTag = 1;
setTheme(R.style.nightTheme);
}
setContentView(R.layout.activity_main);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
themeTag = SharePreUtil.getThemeTag(this);
if(themeTag.equals("0")){
intThemeTag = 0;
setTheme(R.style.dayTheme);
}else{
intThemeTag = 1;
setTheme(R.style.nightTheme);
}
setContentView(R.layout.activity_main);
注意setTheme要在setContentView()前面!
于是就实现咯。