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);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 图片分析,Android图片处理实例分析

本文实例讲述了Android图片处理的方法。分享给大家供大家参考,具体如下:package cn.szbw.util;import Android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.…

android开发按钮颜色,Android编程实现简单设置按钮颜色的方法

本文实例讲述了Android编程实现简单设置按钮颜色的方法。分享给大家供大家参考,具体如下:1.工程目录a.在res目录-新建drawble文件夹放入自定义图片2.main.xmlandroid:orientation"vertical"android:layout_width"fill_parent"androi…

艾默生变频器ev1000故障代码_国产变频器型号大全,梳理国产变频的前世今生!...

在工控领域,变频器已经广为所知且应用范围广泛,各方对变频器能给出形形色色的描述。维基百科给出的定义:“变频器(variable frequency drive,常见缩写VFD),也称为变频驱动器或驱动控制器。变频器是可调速驱动系统的一种…

android音乐播放器案例,Android MediaPlayer实现音乐播放器实例代码

Android MediaPlayer实现音乐播放器1、布局文件android:layout_width"fill_parent"android:layout_height"fill_parent"android:orientation"vertical" >android:id"id/hint"android:layout_width"wrap_content"android:…

单边指数信号的特点_今日股市分析:上证指数若能守住3400,蓄力反弹就有戏...

昨日整体概况上涨:848只 下跌:3009只涨停:69只 跌停:12只昨天的上证指数低开低走,午后冲红又回落,另一边的创业板却是单边下行跌超3%,板块方向农业、洪水概念股、还有电力板块较强。按照昨日置顶…

万丰科技机器人排名_机器人系统集成“7宗最”

摘要:对于众多集成商而言,作为典型的“夹心饼奥利奥”,面对客户的各种要求,“不敢勉强你,只好为难自己”系真实写照。1、企业数量最多GGII统计数据显示,截至2019年年底,中国工业机器人产业企业数…

android 电池高温关机,Android 关机问题分析指南

本篇文章主要介绍 Android 开发中的 关机 部分知识点,通过阅读本篇文章,您将收获以下内容:1 . 确认是亮屏关机还是灭屏关机?关机时是否有播放关机动画?2 . 是直接关机还是关机后会自动重启?3.异常关机时,连…

android switch 未定义,在switch语句中初始化时未定义的变量?

问题本身就是一个明显的答案.无论如何,这是我的代码片段......switch(cSet)...case 8:{ //Special CharactersfinalSet special;char* charSet new char[special.size() 1];charSet[special.size()] 0; //Append null terminatormemcpy(charSet, special.c_str(), special.…

android 克隆对象,克隆会破坏单例对象吗?

假设有这样一个场景,如果复制的目标对象恰好是单例对象,那会不会破坏单例对象呢?当然,我们在已知的情况下肯定不会这么干,但如果发生了意外怎么办?不防来修改一下代码。public class ConcretePrototype imp…

转网口显示未识别的网络_已有1700万用户携号转网 超99%用户1小时内办结

携号转网是利国利民的大举措,受到了很多电信用户的拥护和支持。12月15日,工信部副部长刘烈宏在某会议上进行报告指出,目前我国 “携号转网”服务已经累计有 1700 万用户完成携转,一小时携转成功办结率超过 99%。已有1700万用户携号…

adb 更新 android sdk,[转载]安装Android时SDK AVD MANAGER时更新报错的解决办法

最近安装Android SDK时,发现更新时出现“A folder failed to be renamed ormoved.”等类似错误。经过测试和G后发现解决办法目前有两种情况:1、确实是因为打开了相关目录或者其他程序占用率文件夹句柄。关闭相关资源管理器或者关闭相关程序即可&#xff…

2020.2idea怎么创建html项目_陈肆横项目日记:百度百科怎么创建自己的名字

百度百科是一个介绍人物很好的平台,很多的都想创造属于自己的百度百科。而人物百科词条,是百度百科专门为知名人物提供个人信息展示的平台。创建一个属于自己的百度百科词条,就相当于拥有了一张名片,不仅有着影响力与知名度的传播…

android c++ gizp 调用 so,使用ndk-build编译 android调用的so库

前沿编译so的方法有两种方法第一种就是编写原生的makefile文件利用gcc进行编译,这里我讲解的是另外一种。采用NDK提供的ndk-build编译。简介使用ndk编译的时候需要介绍它的脚本文件,Android.mk和Application.mk,但是Application.mk是可选的,用…

elctron项目_electron项目结构介绍

#项目结构my-project├─ .electron-vue(webpack配置文件)│ └─ build.js(生产环境构建代码)│ └─ dev-client.js(热加载相关)│ └─ dev-runner.js(开发环境启动入口)│ └─ webpack.main.config.js(主进程配置文件)│ └─ webpack.renderer.config.js(渲染进程配…

无法启动mysqll1006_CentOS7下MySQL服务启动失败原因及解决方法

在重启阿里的CentOS7服务器后,重启MySQL 出现错误Starting mysqld (via systemctl):Job for mysqld.service failed because the control process exited with error code.See "systemctl status mysqld.service" and "journalctl -xe" fordetails.[FAILED…

html5判断多选框是否选择的函数,复选框(checkbox)、多选框

1、需求分析可同时选中多个选项,实现全选、全不选、反选等功能。2、技术分析基础的HTML、CSS、JavaScript。3、详细分析3.1 HTML部分图示是一个列表加底部一段文字说明,列表包含三个部分,整体是一个多选列表,上部是总的选项&#…

layer调用父页面方法_Ruby for SketchUp之图层【Layer】

我们学习了群组、组件及组件定义,今天来看看图层【Layer】,在Sketchup2020版本中已经更名为“标记”,如图那么图层在我们建模过程中能带来哪些便利呢?可以快速的隐藏同一图层内所有东西,而不需要逐一选择并右键点击隐藏…

html盒子有哪些属性,盒子模型有哪些属性 在html5中哪些元素具有盒子模型

HTML盒模型基本属性有哪些CSS盒子模型就是在CSS技术所使用的一种思维模型。CSS假定所有的HTML文档元素都生成一个描述该元素在HTML文档布局中所占空间的矩形元素框,可以形象地将其看作是一个盒子。通过定义一系列与盒子相关的属性,可极大地丰富和促进各个…

huffman编码的程序流程图_F28379D之CLB解码多摩川编码器2——LIB版例程讲解(原创)...

我在第一篇文章中已经跟大家介绍过379解码多摩川编码器的一些入手小知识,链接如下TMS320F28379D之CLB解码多摩川编码器1——入手小知识(原创)请大家一定要看入手小知识,再来看例程分析。今天跟大家分析一下TI的官方例程。首先&…

html统计表合并单元格的快捷键,word怎样设置合并单元格快捷键

word2010中合并单元格的快捷键是什么?求解答。合并单元格没有快捷键,不过有个f4是重复上一步操作,所以你要合并多个单元格,那么你可以先点一合并单元格,然后选定你要合并的区域。WORD合并单元格的快捷键怎么设置word合并单元格快…