在设置界面切换主题,是许多app必备的功能,可以在style.xml文件中写好样式,然后在代码中使用setTheme()可以动态切换整个application的主题。具体步骤:

1、准备好要切换的style

style.xml文件:

colors.xml文件:

#4876FF

#ffffff

#3A5FCD

#00ff00

#3A5FCD

#888888

#000000

#3C3C3C

#4876FF

#00ff00

#3C3C3C

#3C3C3C

说明:这里是最普通的两套样式,白天模式和夜间模式,当然了,颜色是我自己乱写的,比较丑。。。

2、写一个BaseActivity,application中的所有activity都继承这个activity,这样,修改整个application主题的操作setTheme()放到这个activity实现,每个activity启动时,在onCreate()方法里只需要调用super.onCreate()方法即可同时修改样式。

BaseActivity可以这样写,这里不用为它设置布局文件,因为它根本不需要呈现出来,我们只是为了扩展它,使用theme而已,注意,如果有布局文件的activity需要设置样式,setTheme()方法必须放在setContentView()方法之前,否则样式设置无效:

import android.content.SharedPreferences;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

public class BaseActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

SharedPreferences preferences = getSharedPreferences("style",MODE_PRIVATE);

int themeId = preferences.getInt("theme",0);

if (themeId == 1){

setTheme(R.style.BaseAppThemeDay);

}else if (themeId == 2){

setTheme(R.style.BaseAppThemeNight);

}

}

}

3、在设置界面SettingActivity设置app主题,同时将主题添加一个标记,存储到SharedPreferences里面,然后BaseActivity每次判断标记设置对应的主题就OK了,setTheme()还有一个需要注意的地方就是activity必须使用recreate()重启才能生效,那么在设置界面设置好主题后怎样通知用户之前浏览的界面重启呢,我采用了EventBus,具体使用方法,见http://blog.csdn.net/harvic880925/article/details/40660137,很感谢作者,这里我就不再赘述,因为作者讲的很好了,反而我还有很多不清楚的,还得继续学习。

新建一个事件类,我觉得主要就是事件订阅和发布的桥梁,我是这样写的,只有一个方法getMsg():

public class ChangeEvent {

private String msg;

public ChangeEvent(String msg){

this.msg = msg;

}

public String getMsg() {

return msg;

}

}

SettingActivity的核心代码:

public void onClick(View v) {

preferences = getSharedPreferences("style",MODE_PRIVATE);

SharedPreferences.Editor editor = preferences.edit();

switch (v.getId()){

case R.id.day:

setTheme(R.style.BaseAppThemeDay);

editor.putInt("theme", 1);

editor.commit();

SettingActivity.this.finish();

EventBus.getDefault().post(new ChangeEvent("change"));

break;

case R.id.night:

setTheme(R.style.BaseAppThemeNight);

editor.putInt("theme", 2);

editor.commit();

SettingActivity.this.finish();

EventBus.getDefault().post(new ChangeEvent("change"));

break;

}

}

3、在需要跳转的界面首先在onCreate()方法里注册EventBus,在onDestory()方法里注销,同时重写onEventMainThread()方法:

//注册EventBus

EventBus.getDefault().register(this);

EventBus.getDefault().unregister(this);//注销

public void onEventMainThread(ChangeEvent event){

String msg = event.getMsg();

if (msg.equals("change")){

this.recreate();

}

}

这样如果在设置界面设置了主题,返回之前界面的时候,activity经过重启,主题生效。效果图如下:

好了,就写到这里吧,感觉自己太差劲了,继续学习,fighting~~

android如何app主题更换,通过EventBus更换android app主题相关推荐

  1. Flutter 主题(皮肤)更换的那些事

    Flutter的主题更换方式,是我所预料不到的. Flutter更换主题,可以统一更换. Flutter UI与原生的Android APP不同,Flutter UI默认就是Material Desi ...

  2. 主题图标_iPhone一键更换主题、图标神器

    iOS图标虽然是经典,但是看久了也是会腻的.今天教大家一个简单的方法,来更换iPhone的图标. 更换主题.图标教程 前往App Store搜索[moloko]进行下载安装,这是一款可以替iPhone ...

  3. android反射替换字体,快速使用反射更换Android全局字体

    问题背景 之前在编写鲤鱼日语时,因为使用了外部的字体,这导致了一个问题就是我的ListView显示的是圆滑的字体,但是其他dialog.Spinner就全都是Android默认字体,这样不统一就会很难 ...

  4. Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)

    首先来个最简单的一键切换主题功能,就做个白天和晚上的主题好了. 先看我们的styles文件: 1 <resources>2 3 <!-- Base application theme ...

  5. android自动切换暗色,超实用!Android 深色模式适配(可定时开启的APP内主题切换管理工具)...

    前言 前面分享了一篇"黑白化主题"的文,主要适用场景是不久就要到来的"清明"等时节或者是其他的国家公祭日什么的(一名成熟的程序员,要学会自己提产品需求). 今天 ...

  6. IDEA相关配置(特别完整)看完此篇就将所有的IDEA的相关配置都配置好了、设置鼠标滚轮修改字体大小、设置鼠标悬浮提示、设置主题、设置窗体及菜单的字体及字体大小、设置编辑区主题、通过插件更换主题

    文章目录 1.创建模块(Module) 2.常用配置 2.1Appearance & Behavior 2.1.1设置主题 2.1.2设置窗体及菜单的字体及字体大小 (可忽略) 2.1.3补充 ...

  7. 用linux更换安卓系统教程,Android折腾记——Linux on Android在Android手机上跑Linux教程...

    前言 手头有淘汰的Android手机,想来将这个手机做服务器使用,收集资料发现了一个Linux on Android的项目,可以直接将常见的Linux发行版安装到手机上Ubuntu.Fedora 等等 ...

  8. miui主题风格_一种android系统换肤功能的设计,董红光:MIUI主题风格.pdf

    MIUI主题风格主题风格主题风格主题风格 一种Android系统换肤功能的设计思路 董红光 2/29/2012 "主题"是什么 ? Symbian的"主题" A ...

  9. android studio app显示红叉_发现这个 APP 后,感觉可以放弃桌面时钟了

    天气 App 的种类不少,风格也很多,有人喜欢简洁干净的,比如 Holi.我的天气.雨时等:有人喜欢酷炫有趣的,像 CARROT.知趣.Umbrella 这些:也有人喜欢数据全面且复杂的,那彩云天气则 ...

最新文章

  1. linux 链接ln的使用 创建和删除符号连接(软、硬链接)
  2. 动漫风html源码,CSS3动画制作一个卡通风格的404错误页面代码
  3. 纸巾,理由最充分的涨价
  4. 软件测试基础:自动化测试、安全测试、性能测试
  5. 【LeetCode】【数组】题号:*283,移动零
  6. 【UIKit】UITableView 5
  7. RSA js 加密解密
  8. 摄像头视频画面接入,使用iframe标签嵌入到页面中(海康威视、萤石)
  9. wechart image标签
  10. 草料二维码-免费的二维码生成工具
  11. HEVC BLA、CRA、IDR
  12. c语言排考场座位链表,用Excel制作考场座位布置图
  13. C语言之结构体就这样被攻克了!(绝对值得收藏的文章)
  14. cacti监控客户端配置
  15. 计算机网络期末考试知识点汇总
  16. TiDB 5.0 HTAP 架构设计与场景解析
  17. 蚂蚁金服的“开放联盟链”如何影响现有公链
  18. 微信小程序引入组件(useExtendedLib)
  19. pms输变电状态监测_输电线路状态监测系统技术规范.pdf
  20. ChatGPT、低代码等技术出现会不会导致底层程序员失业

热门文章

  1. python命令窗口在哪里_详解如何在cmd命令窗口中搭建简单的python开发环境
  2. 【学习】蓝桥杯嵌入式--按键输入
  3. echarts 好看的柱形图
  4. 关于发送邮件附件中文文件名称乱码的问题
  5. MES管理系统中,生产调度业务流程是怎么样的
  6. 读书笔记——吴翰清《白帽子讲Web安全》
  7. 数据残酷物语:北上广深租房图鉴
  8. 【Vue】微信扫码支付
  9. 时间脱敏,也许能稍稍帮助你摆脱焦虑
  10. 机器人定位传感器之激光雷达