之前写过一篇文章:RxBus的实现及简单使用。今天我们尝试使用RxBus动态切换主题。

一、定义主题颜色

color.xml

#F44336

#D32F2F

#F44336

#E91E63

#C2185B

#E91E63

#795548

#5D4037

#795548

#2196F3

#1976D2

#2196F3

#607D8B

#455A64

#607D8B

#FFEB3B

#FBC02D

#FFEB3B

#673AB7

#512DA8

#673AB7

#4CAF50

#388E3C

#4CAF50

#FF5722

#E64A19

#FF5722

#9E9E9E

#616161

#9E9E9E

#00BCD4

#0097A7

#00BCD4

#FFC107

#FFA000

#FFC107

#2196F3

#1E88E5

@color/primary

二、定义主题样式

styles.xml

@color/red_primary

@color/red_primary_dark

@color/red_accent

@color/pink_primary

@color/pink_primary_dark

@color/pink_accent

@color/brown_primary

@color/brown_primary_dark

@color/brown_accent

@color/blue_primary

@color/blue_primary_dark

@color/blue_accent

@color/blue_grey_primary

@color/blue_grey_primary_dark

@color/blue_grey_accent

@color/yellow_primary

@color/yellow_primary_dark

@color/yellow_accent

@color/deep_purple_primary

@color/deep_purple_primary_dark

@color/deep_purple_accent

@color/green_primary

@color/green_primary_dark

@color/green_accent

@color/deep_orange_primary

@color/deep_orange_primary_dark

@color/deep_orange_accent

@color/grey_primary

@color/grey_primary_dark

@color/grey_accent

@color/cyan_primary

@color/cyan_primary_dark

@color/cyan_accent

@color/amber_primary

@color/amber_primary_dark

@color/amber_accent

三、在需要的地方弹出主题选择对话框

private void showThemeChooseDialog() {

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

builder.setTitle("设置主题");

Integer[] res = new Integer[]{R.drawable.red_round, R.drawable.brown_round, R.drawable.blue_round,

R.drawable.blue_grey_round, R.drawable.yellow_round, R.drawable.deep_purple_round,

R.drawable.pink_round, R.drawable.green_round, R.drawable.deep_orange_round,

R.drawable.grey_round, R.drawable.cyan_round};

List list = Arrays.asList(res);

ColorsListAdapter adapter = new ColorsListAdapter(MainActivity.this, list);

adapter.setCheckItem(MyThemeUtils.getCurrentTheme(MainActivity.this).getIntValue());

GridView gridView = (GridView) LayoutInflater.from(MainActivity.this).inflate(R.layout.colors_panel_layout, null);

gridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);

gridView.setCacheColorHint(0);

gridView.setAdapter(adapter);

builder.setView(gridView);

final AlertDialog dialog = builder.show();

gridView.setOnItemClickListener(

new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position, long id) {

dialog.dismiss();

int value = MyThemeUtils.getCurrentTheme(MainActivity.this).getIntValue();

if (value != position) {

PreferenceUtils.getInstance(MainActivity.this).saveParam("change_theme_key", position);

changeTheme(MyThemeUtils.Theme.mapValueToTheme(position));

}

}

}

);

}

对话框圆形颜色选项

在drawable下新建red_round.xml,其他主题颜色类似

四、ColorsListAdapter、colors_image_layout.xml,主题选择框中颜色适配器及其xml

ColorsListAdapter

public class ColorsListAdapter extends BaseAdapter {

private int checkItem;

Context context;

List list;

public ColorsListAdapter(Context context, List list) {

this.context = context;

this.list = list;

}

@Override

public int getCount() {

return list.size();

}

@Override

public Object getItem(int position) {

return list.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

Holder holder;

if (convertView == null) {

convertView = LayoutInflater.from(context).inflate(R.layout.colors_image_layout, null);

holder = new Holder();

holder.imageView1 = (ImageView) convertView.findViewById(R.id.img_1);

holder.imageView2 = (ImageView) convertView.findViewById(R.id.img_2);

convertView.setTag(holder);

} else {

holder = (Holder) convertView.getTag();

}

holder.imageView1.setImageResource(list.get(position));

if (checkItem == position) {

holder.imageView2.setImageResource(R.drawable.ic_done_white);

}

return convertView;

}

public void setCheckItem(int checkItem) {

this.checkItem = checkItem;

}

static class Holder {

ImageView imageView1;

ImageView imageView2;

}

}

colors_image_layout.xml

android:background="@android:color/transparent"

android:orientation="vertical"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:id="@+id/img_1"

android:layout_gravity="center"

android:layout_width="40dp"

android:layout_height="40dp" />

android:id="@+id/img_2"

android:layout_gravity="center"

android:layout_width="20dp"

android:layout_height="20dp" />

五、使用RxBus发布事件和处理事件

发布

private void changeTheme(MyThemeUtils.Theme theme) {

RxBus.getInstance().post(new RxbusEvent(theme));

}

接收

rxSbscription=RxBus.getInstance().toObserverable(RxbusEvent.class)

.subscribe(new Action1() {

@Override

public void call(RxbusEvent rxbusEvent) {

changeTheme(rxbusEvent.getTheme());

}

});

六、用到的工具类

PreferenceUtils

public class PreferenceUtils {

private SharedPreferences sharedPreferences;

private SharedPreferences.Editor shareEditor;

private static PreferenceUtils preferenceUtils = null;

public static final String NOTE_TYPE_KEY = "NOTE_TYPE_KEY";

public static final String EVERNOTE_ACCOUNT_KEY = "EVERNOTE_ACCOUNT_KEY";

public static final String EVERNOTE_NOTEBOOK_GUID_KEY = "EVERNOTE_NOTEBOOK_GUID_KEY";

private PreferenceUtils(Context context){

sharedPreferences = context.getSharedPreferences("ThemeSetting", Context.MODE_PRIVATE);

shareEditor = sharedPreferences.edit();

}

public static PreferenceUtils getInstance(Context context){

if (preferenceUtils == null) {

synchronized (PreferenceUtils.class) {

if (preferenceUtils == null) {

preferenceUtils = new PreferenceUtils(context.getApplicationContext());

}

}

}

return preferenceUtils;

}

public String getStringParam(String key){

return getStringParam(key, "");

}

public String getStringParam(String key, String defaultString){

return sharedPreferences.getString(key, defaultString);

}

public void saveParam(String key, String value)

{

shareEditor.putString(key,value).commit();

}

public boolean getBooleanParam(String key){

return getBooleanParam(key, false);

}

public boolean getBooleanParam(String key, boolean defaultBool){

return sharedPreferences.getBoolean(key, defaultBool);

}

public void saveParam(String key, boolean value){

shareEditor.putBoolean(key, value).commit();

}

public int getIntParam(String key){

return getIntParam(key, 0);

}

public int getIntParam(String key, int defaultInt){

return sharedPreferences.getInt(key, defaultInt);

}

public void saveParam(String key, int value){

shareEditor.putInt(key, value).commit();

}

public long getLongParam(String key){

return getLongParam(key, 0);

}

public long getLongParam(String key, long defaultInt){

return sharedPreferences.getLong(key, defaultInt);

}

public void saveParam(String key, long value){

shareEditor.putLong(key, value).commit();

}

public void removeKey(String key){

shareEditor.remove(key).commit();

}

}

MyThemeUtils

public class MyThemeUtils {

public static void changTheme(Activity activity, Theme theme) {

if (activity == null)

return;

int style = R.style.RedTheme;

switch (theme) {

case BROWN:

style = R.style.BrownTheme;

break;

case BLUE:

style = R.style.BlueTheme;

break;

case BLUE_GREY:

style = R.style.BlueGreyTheme;

break;

case YELLOW:

style = R.style.YellowTheme;

break;

case DEEP_PURPLE:

style = R.style.DeepPurpleTheme;

break;

case PINK:

style = R.style.PinkTheme;

break;

case GREEN:

style = R.style.GreenTheme;

break;

case DEEP_ORANGE:

style = R.style.DeepOrangeTheme;

break;

case GREY:

style = R.style.GreyTheme;

break;

case CYAN:

style = R.style.CyanTheme;

break;

case AMBER:

style = R.style.AmberTheme;

break;

default:

break;

}

activity.setTheme(style);

}

public static Theme getCurrentTheme(Context context) {

int value = PreferenceUtils.getInstance(context)

.getIntParam("change_theme_key", 0);

return MyThemeUtils.Theme.mapValueToTheme(value);

}

public enum Theme {

RED(0),

BROWN(1),

BLUE(2),

BLUE_GREY(3),

YELLOW(4),

DEEP_PURPLE(5),

PINK(6),

GREEN(7),

DEEP_ORANGE(8),

GREY(9),

CYAN(10),

AMBER(11);

private int mValue;

Theme(int value) {

this.mValue = value;

}

public static Theme mapValueToTheme(final int value) {

for (Theme theme : Theme.values()) {

if (value == theme.getIntValue()) {

return theme;

}

}

// If run here, return default

return RED;

}

static Theme getDefault() {

return RED;

}

public int getIntValue() {

return mValue;

}

}

}

基类BaseActivity,主题的初始化。注意,需要变换主题的Activity需继承BaseActivity

public class BaseActivity extends AppCompatActivity {

protected PreferenceUtils preferenceUtils;

@Override

protected void onCreate(Bundle savedInstanceState) {

preferenceUtils = PreferenceUtils.getInstance(this);

initTheme();

super.onCreate(savedInstanceState);

}

private void initTheme() {

MyThemeUtils.Theme theme = MyThemeUtils.getCurrentTheme(this);

MyThemeUtils.changTheme(this, theme);

}

}

android动态改变菜单栏,Android动态设置主题(使用RxBus模式)相关推荐

  1. android 动态改变语言,android动态设置app当前运行语言的方法

    android开发中有时候碰到切换语言的需求,这时候需要通过代码动态改变当前运行语言. package com.example.androidtest; import java.util.Locale ...

  2. android 动态改变文字,android – 如何动态设置文本到TextView?

    我想在活动开始时显示连接的ssid和ip地址.它包含一个图像视图(用于标题,因为我没有使用操作栏)和4个文本视图(ssid标签,ssid值,ipaddr标签和ipaddr值) 我已经测试了获取ssid ...

  3. android线程改变布局,Android线程中设置控件的值提示报错的解决方法

    本文实例讲述了Android线程中设置控件的值提示报错的解决方法.分享给大家供大家参考,具体如下: 在Android线程中设置控件的值一般会与Handler联合使用,如下: package com.y ...

  4. android 壁纸改变回调,Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换...

    已经好久没更新Launcher系列文章,今天不解析源码,讲讲如安在Launcher里面添加桌面设置的功能.今朝很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...

  5. android动态改变布局,Android 动态添加布局的两种方式

    前言 大多数时候我们布局都是用xml来布局的,但有些时候也是会用到动态布局的,尤其是在一些大项目中,动态布局更是体现的淋漓尽致. 所以今天我们就来学习一些动态加添布局的两种方式,分别是 动态添加xml ...

  6. tablayout 动态改变标题_TabLayout(动态添加自定义tab)+ViewPager

    1.布局如下: TabLayout+ViewPager 2.动态添加自定义tab,如下: 添加普通tab方式: tabLayout = (TabLayout)findViewById(R.id.tab ...

  7. android wm 改变大小,Android 屏幕适配经验总结

    本文记录一些适配问题的研究,基础概念不做过多介绍. Android在做屏幕适配的时候一般考虑两个因素:分辨率和dpi.分辨率是屏幕在横向.纵向上的像素点数总和,一般用"宽x高"的形 ...

  8. android 沉浸式菜单栏,Android沉浸式全屏讲解(状态栏、导航栏处理)

    Android应用中经常会有一些要求全屏显隐状态栏导航栏的需求.通过全屏沉浸式的处理可以让应用达到更好的显示效果.下面系统的讲解一下有关全屏,隐藏状态栏导航栏,沉浸式的知识. 在Android4.1之 ...

  9. 华为手机怎么导入主题_如何在华为手机上设置主题动态壁纸

    许多智能手机现在可以设置动态桌面墙纸,您还可以选择自己喜欢的桌面主题. 很多用户经常使用系统随附的主题界面后会感到呆板,因此他们想自己设置一些不同的主题界面,还可以自定义一些动态锁屏墙纸. 但是,有很 ...

最新文章

  1. 点歌服务器工作原理,KTV点歌系统方案概述
  2. python使用字典格式化字符串-Python字符串格式方式 %s format()
  3. linux运行windows环境变量,使用环境变量识别Cygwin,Linux,Windows
  4. php 嵌套 mysql_PHP中实现MySQL嵌套事务的两种解决方案,mysql嵌套_PHP教程
  5. uni中动态加载class_Java基础·类加载、反射
  6. P1494-[国家集训队]小Z的袜子【分块优化莫队】
  7. 非正交坐标系-模态正交的物理及几何意义
  8. 【报告分享】基础设施的新兴趋势-毕马威.pdf(附pdf下载链接)
  9. C语言每日一题之No.12
  10. [并非笑话]当Borland的工程师向微软寻求技术支持时
  11. 光大银行监控平台实践,含详细工具及架构选型思路
  12. 【博客学习之旅】仰望星空,脚踏实地
  13. ASCII码对应表chr(9)、chr(10)、chr(13)、chr(34)、chr(39)、chr(46)
  14. 排序算法--鸽巢排序(PigeonholeSort)的原理、排序思路、适用场景及代码示例
  15. 直播平台搭建源码,css预加载旋转动画 与 流光字体
  16. FP-Tree算法的实现
  17. 外接硬盘无法进入PE界面
  18. 液晶显示c语言程序设计,12864液晶显示屏串行驱动演示C语言程序设计
  19. 笔记本显卡天梯图2023 笔记本显卡性能天梯图2023年2月
  20. 剑指offer_073 狒狒吃香蕉

热门文章

  1. 阿里带火的中台,究竟是个啥?
  2. 工作量不断增加的微软Azure,正缩小与亚马逊AWS的差距
  3. 云计算到底是怎么玩的?
  4. js组装知识(待续……)
  5. oracle 12c 低版本,oracle高版本迁移数据到低版本(12c至11g)方法
  6. java 最大矩形_Java实现 LeetCode 85 最大矩形
  7. devc++源文件未编译_iOS 编译知识小结
  8. android system.img编译,快速编译system.img和boot.img的方法
  9. jmeter 压测 RabbitMQ_单机
  10. linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(oracle基础配置_04)