博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android动态设置主题(使用RxBus模式)
阅读量:7091 次
发布时间:2019-06-28

本文共 10155 字,大约阅读时间需要 33 分钟。

之前写过一篇文章:。今天我们尝试使用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

                                            

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

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

五、使用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://noiql.baihongyu.com/

你可能感兴趣的文章
MVVM Light (Part 4)
查看>>
很强大的 js拖曳效果
查看>>
Document versioning
查看>>
jbpm入门样例
查看>>
Unity3D如何减少安装包大小
查看>>
漫游Kafka设计篇之数据持久化
查看>>
Java提高篇——equals()与hashCode()方法详解
查看>>
oracle用户创建
查看>>
dubbo-admin 管理台的部署
查看>>
ACM进阶计划
查看>>
【转】数据库中查询记录时是否每次只能使用一个索引?
查看>>
C#单例测试(懒汉式双锁保证线程安全)
查看>>
Java知识点总结
查看>>
SQL Server 2000/2005检测存储过程名是否存在,存在删除
查看>>
Windows Hook
查看>>
Javascript分号,加还是不加?
查看>>
TDD中的一些问题
查看>>
[探讨]多版本并发控制(MVCC)在分布式系统中的应用
查看>>
通通玩blend美工(5)——旋转木马,交互性设计
查看>>
$ cd `dirname $0` 和PWD%/* shell变量的一些特殊用法
查看>>