android使用setTheme的方式实现主题切换
2015-11-19 17:30
447 查看
theme的意思即风格,在android中你可以理解成是一整套属性的集合,设置了theme可以看做为为APP的一些全局的变量赋值,然后之后的界面显示会使用这些值来显示出相应的效果。
设置theme方式实现主题切换的详细步骤在这篇文章已经有详细描述,我就不再赘述了,这里介绍一下设置theme方式实现主题切换的一些实现细节。
上边那个博文中也提到了,设置theme要在设置activity的显示内容之前。网上有人说是可以调用recreate方法重启activity,但是重启的时候有闪动并且当前的状态也不太好保存,所以并不是好的解决方法。
设置theme的整体思路是正确的,当前的theme标记要保存在本地,每个activity启动的时候在setContentView之前取出该标记并调用setTheme方法设置theme即可。而主题切换的功能其实是改变了这个保存的标记,但是为了让用户能意识到主题已经切换了,在主题切换所在的activity就需要立即应用到这个已经变化了的主题。这里有两种方式:一种是暴力方式,即按照切换后的主题方案分别设置当前界面所有可见元素的属性,因为设置主题的界面通常只有一个所以一次设置之后不会有过多的这种繁琐的操作;另外一种是使用fragment,fragment也可以设置theme,代码如下:
如果你的主题切换设置界面是写在fragment里边,只需要在改变了theme之后重新加载这个fragment就行了。
下边是一个例子效果:
另附一个demo下载地址
设置theme方式实现主题切换的详细步骤在这篇文章已经有详细描述,我就不再赘述了,这里介绍一下设置theme方式实现主题切换的一些实现细节。
上边那个博文中也提到了,设置theme要在设置activity的显示内容之前。网上有人说是可以调用recreate方法重启activity,但是重启的时候有闪动并且当前的状态也不太好保存,所以并不是好的解决方法。
设置theme的整体思路是正确的,当前的theme标记要保存在本地,每个activity启动的时候在setContentView之前取出该标记并调用setTheme方法设置theme即可。而主题切换的功能其实是改变了这个保存的标记,但是为了让用户能意识到主题已经切换了,在主题切换所在的activity就需要立即应用到这个已经变化了的主题。这里有两种方式:一种是暴力方式,即按照切换后的主题方案分别设置当前界面所有可见元素的属性,因为设置主题的界面通常只有一个所以一次设置之后不会有过多的这种繁琐的操作;另外一种是使用fragment,fragment也可以设置theme,代码如下:
@Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { final Context contextThemeWrapper = new ContextThemeWrapper( getActivity(), isDay ? R.style.day : R.style.night); LayoutInflater localInflater = inflater .cloneInContext(contextThemeWrapper); View v = localInflater.inflate(R.layout.fragment_layout, container, false); return v; }
如果你的主题切换设置界面是写在fragment里边,只需要在改变了theme之后重新加载这个fragment就行了。
下边是一个例子效果:
另附一个demo下载地址
相关文章推荐
- Android数据库查询效率进阶篇
- Android如何捕获手机回退键(BACK)实现程序退出?
- Android Support 包里究竟有什么
- Android开发艺术探索学习-IPC之Binder(二)
- 比较强大 优秀的开源框架 :Android图片加载与缓存:Android Glide 的用法
- android canvas画图
- Android中Handler详解,线程间通信机制
- Gradle打包android 项目
- Android点住按钮同时再点击按钮外的效果
- 活动生命周期
- android拍照和本地选择图片
- Android各个support library特征和区别(官方文档)
- Google Nexus5关于Android 6.0源码的同步,编译和烧写
- android zxing二维码横屏改竖屏
- Android 输入系统之InputDispatcher篇
- Shape Drawable解析
- android layout_weight 用法
- Android的BroadcastReceiver和EventBus区别是什么
- Android设置TextView的Selector来控制点击的颜色
- Android 中的 Service 全面总结