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之 ...
- 华为手机怎么导入主题_如何在华为手机上设置主题动态壁纸
许多智能手机现在可以设置动态桌面墙纸,您还可以选择自己喜欢的桌面主题. 很多用户经常使用系统随附的主题界面后会感到呆板,因此他们想自己设置一些不同的主题界面,还可以自定义一些动态锁屏墙纸. 但是,有很 ...
最新文章
- Yolov3网络架构分析
- 引领深度学习潮流,刷屏计算机视觉顶会,揭秘商汤研究梦之队
- window.open 实现session隔离_InnoDB存储引擎MVCC实现原理
- basepath的作用 (转)
- image to pdf
- hive币涨幅空间大吗_自动消防水炮只能安装在大空间场所吗
- Nginx+Tomcat+Memcached集群 【测试成功】
- 排序序列排序算法总结(二)——快速排序、归并排序
- 数据结构——>单向环形链表
- 数字电子技术基础一览
- 游戏开发中的向量数学
- JZOJ 1266. 玉米田
- linux为什么不需要磁盘碎片整理,Linux不用磁盘碎片整理原因分析.doc
- html开发android,使用HTML5开发Android本地应用(一)
- 自己动手实现fft.m函数
- matlab 定义函数 调用,matlab 定义函数,matlab定义函数并调用
- 古文觀止卷九_永州韋使君新堂記_柳宗元
- far word 远指针
- 常用的css特效(一)
- checkbox选中和不选中 jqu_jQuery控制checkbox选中状态但是不显示选中
热门文章
- 华为发布基于第二代英特尔®至强®可扩展处理器家族的新一代服务器
- Vue项目启动后Error: Cannot find module ‘xxx’的解决方法
- DMN结合bpmn简化流程_07
- org/springframework/util/backoff/BackOff
- 当自己犹豫时,坐下来读一读
- form表单提交,后台实体类接收转义问题 解决方案
- flowable 集成mongodb
- 开发经验分享_01_遇到问题三步走(思路+实战)
- JavaScript-操作DOM对象-创建和插入dom节点
- html-表单的应用