android动态改变菜单栏,Android动态设置主题(使用RxBus模式)
之前写过一篇文章: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模式)相关推荐
- android 动态改变语言,android动态设置app当前运行语言的方法
android开发中有时候碰到切换语言的需求,这时候需要通过代码动态改变当前运行语言. package com.example.androidtest; import java.util.Locale ...
- android 动态改变文字,android – 如何动态设置文本到TextView?
我想在活动开始时显示连接的ssid和ip地址.它包含一个图像视图(用于标题,因为我没有使用操作栏)和4个文本视图(ssid标签,ssid值,ipaddr标签和ipaddr值) 我已经测试了获取ssid ...
- android线程改变布局,Android线程中设置控件的值提示报错的解决方法
本文实例讲述了Android线程中设置控件的值提示报错的解决方法.分享给大家供大家参考,具体如下: 在Android线程中设置控件的值一般会与Handler联合使用,如下: package com.y ...
- android 壁纸改变回调,Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换...
已经好久没更新Launcher系列文章,今天不解析源码,讲讲如安在Launcher里面添加桌面设置的功能.今朝很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...
- android动态改变布局,Android 动态添加布局的两种方式
前言 大多数时候我们布局都是用xml来布局的,但有些时候也是会用到动态布局的,尤其是在一些大项目中,动态布局更是体现的淋漓尽致. 所以今天我们就来学习一些动态加添布局的两种方式,分别是 动态添加xml ...
- tablayout 动态改变标题_TabLayout(动态添加自定义tab)+ViewPager
1.布局如下: TabLayout+ViewPager 2.动态添加自定义tab,如下: 添加普通tab方式: tabLayout = (TabLayout)findViewById(R.id.tab ...
- android wm 改变大小,Android 屏幕适配经验总结
本文记录一些适配问题的研究,基础概念不做过多介绍. Android在做屏幕适配的时候一般考虑两个因素:分辨率和dpi.分辨率是屏幕在横向.纵向上的像素点数总和,一般用"宽x高"的形 ...
- android 沉浸式菜单栏,Android沉浸式全屏讲解(状态栏、导航栏处理)
Android应用中经常会有一些要求全屏显隐状态栏导航栏的需求.通过全屏沉浸式的处理可以让应用达到更好的显示效果.下面系统的讲解一下有关全屏,隐藏状态栏导航栏,沉浸式的知识. 在Android4.1之 ...
- 华为手机怎么导入主题_如何在华为手机上设置主题动态壁纸
许多智能手机现在可以设置动态桌面墙纸,您还可以选择自己喜欢的桌面主题. 很多用户经常使用系统随附的主题界面后会感到呆板,因此他们想自己设置一些不同的主题界面,还可以自定义一些动态锁屏墙纸. 但是,有很 ...
最新文章
- 点歌服务器工作原理,KTV点歌系统方案概述
- python使用字典格式化字符串-Python字符串格式方式 %s format()
- linux运行windows环境变量,使用环境变量识别Cygwin,Linux,Windows
- php 嵌套 mysql_PHP中实现MySQL嵌套事务的两种解决方案,mysql嵌套_PHP教程
- uni中动态加载class_Java基础·类加载、反射
- P1494-[国家集训队]小Z的袜子【分块优化莫队】
- 非正交坐标系-模态正交的物理及几何意义
- 【报告分享】基础设施的新兴趋势-毕马威.pdf(附pdf下载链接)
- C语言每日一题之No.12
- [并非笑话]当Borland的工程师向微软寻求技术支持时
- 光大银行监控平台实践,含详细工具及架构选型思路
- 【博客学习之旅】仰望星空,脚踏实地
- ASCII码对应表chr(9)、chr(10)、chr(13)、chr(34)、chr(39)、chr(46)
- 排序算法--鸽巢排序(PigeonholeSort)的原理、排序思路、适用场景及代码示例
- 直播平台搭建源码,css预加载旋转动画 与 流光字体
- FP-Tree算法的实现
- 外接硬盘无法进入PE界面
- 液晶显示c语言程序设计,12864液晶显示屏串行驱动演示C语言程序设计
- 笔记本显卡天梯图2023 笔记本显卡性能天梯图2023年2月
- 剑指offer_073 狒狒吃香蕉
热门文章
- 阿里带火的中台,究竟是个啥?
- 工作量不断增加的微软Azure,正缩小与亚马逊AWS的差距
- 云计算到底是怎么玩的?
- js组装知识(待续……)
- oracle 12c 低版本,oracle高版本迁移数据到低版本(12c至11g)方法
- java 最大矩形_Java实现 LeetCode 85 最大矩形
- devc++源文件未编译_iOS 编译知识小结
- android system.img编译,快速编译system.img和boot.img的方法
- jmeter 压测 RabbitMQ_单机
- linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(oracle基础配置_04)