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

欢迎加入我的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;

}

}

}

android os夜间,Android夜间模式实现相关推荐

  1. android.os.log,android.os.Handler和java.util.logging.Handler之间的区别?

    从 the Android documentation开始: android.os.Handler: A Handler allows you to send and process Message ...

  2. android.os.parcelable,Android中Parcelable如可快速生成

    之前都是自己手动实现,有时候属性比较多的时候,写着累就不说了,问题是修改的时候往往会忘记哦,然后用的时候就SB了.这种日子谁想继续呢,不要担心,大牛还是有的,于是乎就找到了"Android ...

  3. 小米里的android os,LineageOS Android 10支持列表更新:一加小米多款在内

    IT之家4月1日消息 据外媒AndroidPolice报道,今天又有一系列新设备被添加到LineageOS Android 10版本的"支持"列表中.好消息是,在过去18个月里,大 ...

  4. android.os.networkonmainthredexception,android.os.NetworkOnMainThreadException 解决办法:

    产生的原因: 在4.0之后在主线程里面执行Http请求都会报这个错,也许是怕Http请求时间太长造成程序假死的情况 解决办法: 1.在发起Http请求的Activity里面的onCreate函数里面添 ...

  5. Android开发学习——android体系结构

    Android的体系结构采用了分层架构的思想, 从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核. 一 应用程序层 该层提供一些核心应用程序包,例 ...

  6. android 初始化类,Android 常用编程技巧/Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)...

    1.设置屏幕的亮度: WindowManager.LayoutParams lp=getWindow().getAttributes(); lp.screenBrightness=1.0f; getW ...

  7. android html5 加密,android studio MD5加密 示例代码

    md5加密法核心源码 package com.study.luoki; import android.app.*; import android.os.*; import android.widget ...

  8. Android原生方式实现夜间模式

    夜间模式的实现,Github上有很多种相关的库和Demo,但实现方式都比较复杂,并且为了实现一个小功能,引入一个第三方库,很多时候,都是得不偿失的. 实现夜间模式的主要思路就是改变程序的style,主 ...

  9. android support library github,Android Support Library 之 夜间模式

    原标题:Android Support Library 之 夜间模式 前言 夜间模式实现方式:1.通过切换theme来实现夜间模式.优点:可以匹配多套主题,并不局限于黑白模式缺点:需要大量定义主题详见 ...

  10. android 夜间模式源码,Android Support Library 之 夜间模式

    前言 夜间模式实现方式:1.通过切换theme来实现夜间模式.优点:可以匹配多套主题,并不局限于黑白模式缺点:需要大量定义主题详见博客:http://wuxiaolong.me/2015/08/19/ ...

最新文章

  1. c#_HashSet
  2. linux文件目录详细介绍
  3. 一篇深入剖析PCA的好文
  4. 深入理解分布式技术 - 分库分表后的唯一主键解决方案
  5. Linux网络编程---详解TCP
  6. sublime开发php插件下载,SublimeText3 配置PHP开发插件
  7. 【音效处理】Delay/Echo 简介
  8. Netty工作笔记0050---Netty核心模块1
  9. java获取系统dpi_java中如何获得打印机的dpi
  10. 结对编程后传之做汉堡
  11. 食品工程计算机辅助设计,食品工程CAD技术应用及实例
  12. Bailian3719 学生信息用qsort排序【排序+字符串库函数】
  13. rust socket 客户端例子
  14. SitePoint播客#128:我最不喜欢的10岁
  15. 分段衰减衰减系数_深度学习中的固定学习率衰减策略总结
  16. 洛谷P1007独木桥题解
  17. ARM CHI总线笔记
  18. 微信公众平台开发的相关问题
  19. 微信开发者工具source看不了代码_微信开发者工具和开发
  20. 基带、频带、宽带、带宽

热门文章

  1. 磨刀不误砍柴工—— 有用的文件整理、桌面切换工具
  2. Fisher分类器Matlab
  3. 新浪、腾讯股票价格相关接口
  4. 她把一个“三无”产品做进故宫,还一举颠覆了蛋糕界,厉害了我的仙女姐姐...
  5. 软件行业深度报告:国产操作系统浮沉录
  6. 如何保存Win10自动更新的壁纸
  7. “读者--写者”问题练习题目:南北桥问题
  8. 结合Spring源码学习单例设计模式
  9. 【调剂】2020齐齐哈尔大学通信与信息系统,电子与通信工程 硕士调剂预招生...
  10. 结合工程实践选题调研分析同类软件产品