每个人对于主题皮肤的喜好不同,所以一款好的软件应该有主题皮肤的选项,让用户能选择自己喜好的皮肤和主题,这样才更能获得用户的亲睐

下面通过一个简单的例子实现换肤功能

这个例子我通过了3种不同的方法实现换肤

方案一:

直接使用Android提供的主题

activity_main.java

设置了4个按钮,用于控制主题和界面的跳转

<LinearLayout 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"tools:context=".MainActivity"android:orientation="vertical" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="@string/hello_world" /><Button android:id="@+id/id_btn_day"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Day"/><Button android:id="@+id/id_btn_night"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Night"/><Button android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="界面一"android:onClick="btn_next1"/><Button android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="界面二"android:onClick="btn_next2"/></LinearLayout>

MainActivity.java

设置Android自带的主题

public class MainActivity extends Activity
{private int mThemeId = -1;// 皮肤主题ID,默认-1 不处理private String THEME_KEY = "theme";@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);if (savedInstanceState != null){if (savedInstanceState.getInt(THEME_KEY,-1) != -1)// 读取皮肤主题ID,-1 不处理{mThemeId = savedInstanceState.getInt(THEME_KEY);this.setTheme(mThemeId);//设置主题皮肤}}setContentView(R.layout.activity_main);this.findViewById(R.id.id_btn_day).setOnClickListener(mOnClickListener);this.findViewById(R.id.id_btn_night).setOnClickListener(mOnClickListener);}View.OnClickListener mOnClickListener = new View.OnClickListener(){@Overridepublic void onClick(View v){switch (v.getId()){case R.id.id_btn_day:onTheme(android.R.style.Theme_Light);break;case R.id.id_btn_night:onTheme(android.R.style.Theme_Black);break;default:break;}}};// 设置主题,并重建private void onTheme(int iThemeId){mThemeId = iThemeId;this.recreate();}// 保存主题ID,onCreate 时读取主题@Overrideprotected void onSaveInstanceState(Bundle outState){super.onSaveInstanceState(outState);outState.putInt(THEME_KEY, mThemeId);}public void btn_next1(View view){Intent intent = new Intent(MainActivity.this,SecondActivity.class);startActivity(intent);}public void btn_next2(View view){Intent intent = new Intent(MainActivity.this,ThirdActivity.class);startActivity(intent);}
}

实现效果如图

  

方案二:

second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"android:id="@+id/id_skin_linearlayout" ><TextView android:id="@+id/id_skin_textview"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello_world"/><Button android:id="@+id/id_skin_bt1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="默认"/><Button android:id="@+id/id_skin_bt2"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="皮肤一"/><Button android:id="@+id/id_skin_bt3"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="皮肤二"/></LinearLayout>

SecondActivity.java

直接控制使用颜色还是图片作为背景

public class SecondActivity extends Activity
{LinearLayout linearLayout;TextView textView;Button bt1,bt2,bt3;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.second);textView = (TextView)findViewById(R.id.id_skin_textview);textView.setText("默认皮肤");linearLayout = (LinearLayout)findViewById(R.id.id_skin_linearlayout);linearLayout.setBackgroundColor(Color.BLUE);bt1 = (Button)findViewById(R.id.id_skin_bt1);bt2 = (Button)findViewById(R.id.id_skin_bt2);bt3 = (Button)findViewById(R.id.id_skin_bt3);bt1.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){linearLayout.setBackgroundColor(Color.BLUE);textView.setText("默认皮肤");}});bt2.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){linearLayout.setBackground(getResources().getDrawable(R.drawable.skin1));textView.setText("皮肤一");}});bt3.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){linearLayout.setBackground(getResources().getDrawable(R.drawable.skin2));textView.setText("皮肤二");}});}
}

效果如图

  

方案三:

third.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"android:id="@+id/id_skin_layout" ><TextView android:id="@+id/id_skin_textview"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello_world"/><RadioGroup android:id="@+id/radioGroup"android:contentDescription="主题设置"android:layout_width="wrap_content"android:layout_height="wrap_content"><RadioButton android:id="@+id/id_skin_btn1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="默认皮肤"android:checked="true"/><RadioButton android:id="@+id/id_skin_btn2"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="皮肤一"/><RadioButton android:id="@+id/id_skin_btn3"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="皮肤二"/></RadioGroup>
</LinearLayout>

ThemeSetting.java

通过这个类管理皮肤

public class ThemeSetting
{public int nThemeSkin;//使用的皮肤变量public int nThemeIndex;//使用的皮肤索引public static final int THEME_DEFAULT = 0;public static final int THEME_PIC = 1;public static final int THEME_COLOR = 2;public void SetTheme(int nTheme){nThemeIndex = nTheme;switch (nTheme){case THEME_DEFAULT:nThemeSkin = R.drawable.skin1;break;case THEME_PIC:nThemeSkin = R.drawable.skin2;break;case THEME_COLOR:nThemeSkin = R.color.ColorBlue;break;default:nThemeSkin = R.drawable.skin1;break;}}public int GetTheme(){return nThemeIndex;}
}

ThemeSettingObj.java

申明一个皮肤类对象,用于统一管理皮肤类

public class ThemeSettingObj
{public static ThemeSetting gThemeSettingObj = new ThemeSetting();
}

ThirdActivity.java

public class ThirdActivity extends Activity
{public LinearLayout linearLayout;public TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.third);//设置默认文字textView = (TextView)findViewById(R.id.id_skin_textview);textView.setText("默认皮肤");//设置默认皮肤linearLayout = (LinearLayout)findViewById(R.id.id_skin_layout);ThemeSettingObj.gThemeSettingObj.SetTheme(ThemeSetting.THEME_DEFAULT);linearLayout.setBackground(getResources().getDrawable(ThemeSettingObj.gThemeSettingObj.nThemeSkin));//根据ID找到RadioGroup实例RadioGroup group = (RadioGroup)findViewById(R.id.radioGroup);//绑定一个匿名监听器group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId){//获取变更后的选中项的IDint radioButtonId = group.getCheckedRadioButtonId();//根据ID获取RadioButton的实例RadioButton rb = (RadioButton)findViewById(radioButtonId);//更新文本内容,以符合选中项textView.setText(rb.getText());//设置选择不同Id的不同背景switch (checkedId){case R.id.id_skin_btn1:ThemeSettingObj.gThemeSettingObj.SetTheme(ThemeSetting.THEME_DEFAULT);break;case R.id.id_skin_btn2:ThemeSettingObj.gThemeSettingObj.SetTheme(ThemeSetting.THEME_PIC);break;case R.id.id_skin_btn3:ThemeSettingObj.gThemeSettingObj.SetTheme(ThemeSetting.THEME_COLOR);break;default:break;}linearLayout.setBackground(getResources().getDrawable(ThemeSettingObj.gThemeSettingObj.nThemeSkin));}});}}

效果如图

  

源码下载

Android之主题皮肤实现相关推荐

  1. 【Android Studio安装部署系列】八、Android Studio主题皮肤更换

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio具有自己的主题皮肤,但是如果想要更换自己喜欢的主题皮肤,可以参考下面的步骤. 注意,更换主题皮肤,之前的 ...

  2. android 自定义皮肤,Android Studio 自定义皮肤主题和背景

    新的一年,新的开始,在这里先祝福大家在新的一年收获多多,多升职,多加薪,代码没BUG. 第一 Android Studio自定义皮肤主题-ColorThemes 寒假期间有人问我, "你代码 ...

  3. android studio 皮肤,Android Studio 自定义皮肤主题和背景

    Android Studio自定义皮肤主题-ColorThemes 最近有人问我, "你代码这是用的什么字体? 看着好舒服", 其实这是用了自定义皮肤主题包,主题包下载网站 htt ...

  4. android微信分享怎么自定义样式,微信更新!主题皮肤终于支持自定义了,样式超多有个性...

    原标题:微信更新!主题皮肤终于支持自定义了,样式超多有个性 今日分享:微信主题 适用系统:安卓 微信最近又更新了,很多网友吐槽安装包越来越大,感觉已经不再是以前"小而美"的样子了. ...

  5. android colorstatelist_B站Android多主题框架开源:MagicaSakura

    最近不少同学在后台催更,还有朋友开始问我是不是出啥事了- -!,是得出来解释下,其实就是最近重心没有放在公众号这块,至于具体缘由就不说啦,感觉各种借口都要被我用完了,你们就当我懒癌复发吧.讲真,真心要 ...

  6. android最简单的更换主题,教你更换Android手机主题

    买了Android手机的朋友肯定都希望手机桌面拥有一个好看的手机主题,但是具体操作却不会,下面就给大家简单教程. 目前在android系统上常见的主题软件有:open home.ADW launche ...

  7. Android UI换皮肤或 白天黑夜模式

    Android UI换皮肤或 白天黑夜模式 UI换皮肤或白天黑夜模式,从产品上来看,是两种不同产品设计模式:白天黑夜模式只有两种模式:而换皮肤可以有多套,可以进行商业化,并盈利. > 白天夜间模 ...

  8. [转载]Android实现更换皮肤功能

    原文地址:Android实现更换皮肤功能作者:兜兜 转载请注明出处,商用请与本人联系. 本系列专题培训适用范围:初级Android程序员,即有J2SE基础和Android初级水平.J2SE基础是指掌握 ...

  9. android原生输入法皮肤,duang_精选布局_触屏皮肤_皮肤布局_百度手机输入法

    皮肤布局小贴士: 说明: 该皮肤布局仅适用于2.1及以上版本百度手机输入法,不适用于2.0版. 安装前请注意该皮肤布局所适用的手机平台, 如与您的手机平台不符合,使用后可能出现皮肤布局模糊或者过大的情 ...

最新文章

  1. scala学习手记34 - trait方法的延迟绑定
  2. qt练习11 鼠标,按键,滚轮事件学习
  3. Spring.NET学习笔记11——自定义对象行为(基础篇) Level 200
  4. 解决 GraphQL 的限流难题
  5. 安卓开发fragment之间的切换_Android开发必会的组件化技术—Android架构和提升必备...
  6. Apache JMeter 测试webservice接口 中文乱码
  7. 四色着色问题 c语言编程,数据结构-图着色问题
  8. 利用dynamoRIO实现codeCoverage
  9. centos 设置时间为北京时间
  10. fft 相位谱_数值积分——使用FFT来降低计算量
  11. 【报错】android.database.sqlite.SQLiteException: no such column: id (code 1): , while compiling: select
  12. 常见前端面试题及答案(下)
  13. mybatis pageHelper 不分页
  14. java fso_asp之FSO大全
  15. 生产排程遇难题?APS系统来解决
  16. 最好的黄金技术指标250均线用法
  17. 相似度系列8:unify-BARTSCORE: Evaluating Generated Text as Text Generation
  18. MaxEnt框架下的RL
  19. 龙芯(mips)+麒麟V10 electron适配
  20. 千锋教育+计算机四级网络-计算机网络学习-04

热门文章

  1. KVM创建虚拟机ERROR Host does not support any virtualization options
  2. Expanding Low-Density Latent Regions for Open-Set Object Detection
  3. html li被挤下去,求助CSS大大页面小化后变形被挤下去了
  4. 求解矩阵方程耗时比较(直接求逆,Qr分解,LU分解)
  5. matlab判断星期几的语句,C语言之根据英文星期首字母来判断星期几
  6. 第12章 ‘expect’和‘assume’
  7. 工业表面缺陷检测数据集汇总
  8. 有效APP地推的必要性
  9. 吴军,阅读与写作,18,如何写好简历
  10. 【matlab 官方刷题网站cody】题目解答积累