查看我的全部开源项目【开源实验室】
欢迎加入我的QQ群:【201055521】,本博客客户端下载【请点击】
本文原创,转载请注明地址:http://blog.kymjs.com/

最近在做一个Android夜间模式的功能,又重新研究了一下Theme机制。贯彻我的风格,以解决问题为目标,写了个小Demo,简单了实现了切换夜间模式,为大家讲解。
在Activity中有一个方法叫setTheme(),可以设置Activity的Theme,当然Application类中也有相同的方法,也可以在Application中设置当前应用的Theme。就好像我们可以在Manifest文件中通过android:theme=“”来设置主题一样。

创建属性名

在工程目录res/values/下新建一个xml文件,名字可以自定义,这里我的叫theme_attr.xml 内容如下:

    <?xml version="1.0" encoding="utf-8"?>    <resources>        <attr name="text_bg" format="reference|color"/>        <attr name="bottom_bg" format="reference|color"/>    </resources>

其中text_bg和bottom_bg就是我们定义的两个属性名,后面的format是指的这个属性名的类型,这里我是用reference|color表示既可以是一个引用,也可以是一个argb颜色值。除了这些你还可以选择int,boolan,string等数据类型。

定义资源样式

创建完属性名后就需要创建主题样式了。依旧在res/values/下新建一个xml文件,或者也可以在原style.xml中写,是一样的。这里为了项目结构清晰,就单独写一个文件叫theme_dark.xml 我们需要在这里定义步骤一中定义的各属性名在当前主题下的值。

    <resources>        <!-- Base application theme. -->        <style name="DarkTheme" parent="@android:style/Theme"> <item name="text_bg">@drawable/selector_text_bg_dark</item> <item name="bottom_bg">@drawable/bg_bottombar_dark</item> </style>    </resources>

这里可以看到因为上面我属性类型定义了引用或颜色,所以这里的值我既可以传@drawable类型的引用也可以直接赋值一个#ff00ff这样的颜色值。

布局中使用

布局文件中使用我们自定义的文件时,需要添加一个问号来表示引用。例如

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">          <Button  android:id="@+id/login_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?text_bg" android:text="登录"/>    </LinearLayout>

这样就表示我们的登录按钮的背景使用的是前面定义的属性名text_bg在当前主题下的值,也就是我们步骤二中定义的@drawable/selector_text_bg_dark这张图片(其实是一个选择器了)

代码中使用

以一个最简单的例子来说明了,需要注意的是一定要在Activity的setContentView调用之前调用setTheme()方法。网上有很多介绍都说的是在super之前,其实这种说法并不准确。当我们动态切换主题时,例如点击某个按钮,切换主题,这个时候需要再次手动调用setContentView()方法,并重新调用控件初始化以及监听器设置。但是这里告诉你一种简单方法:直接手动调用recreate()方法,再次创建视图就可以了。

    public class UserInfor extends KJActivity {        @BindView(id = R.id.logout_btn, click = true)        private Button mBtnLogout;        @Override        public void setRootView() {            setContentView(R.layout.activity_userinfor);        }        @Override        public void widgetClick(View v) {            super.widgetClick(v);            switch (v.getId()) {                case R.id.logout_btn:                    setTheme(R.style.DarkTheme);                    recreate();                    break;            }        }    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

更多相关文章

  1. Android(安卓)task和affinity讲解
  2. Qt平台下OpenCV for Android库的顺序
  3. 剖析andriod联系人
  4. Android加载SVG实现交互式地图绘制
  5. Android(安卓)5.0+ 高级动画开发系列 矢量图动画
  6. Android(安卓)截图实现(2)
  7. 经典Android试题及答案
  8. Android(安卓)发送HTTP GET POST 请求以及通过 MultipartEntityB
  9. android中apk反编译

随机推荐

  1. Android架构分析填坑
  2. Android的七巧板Activity之一 Activity的
  3. 谈谈我的Android多渠道打包方式
  4. Android(安卓)播放mp3 tag乱码分析之jni
  5. Android(安卓)4.4系统适配AlertDialog,半
  6. Android edittext 属性inputtype详解
  7. 如何避免Android内存泄漏
  8. 给android增加屏幕校准
  9. 如何给你的Android 安装文件(APK)瘦身(一)
  10. Lumia920和930对比哪个好?诺基亚Lumia920