android os夜间,Android夜间模式实现

查看我的全部开源项目【开源实验室】

欢迎加入我的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 内容如下:

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

定义资源样式

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

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

布局中使用

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

这样就表示我们的登录按钮的背景使用的是前面定义的属性名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;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值