Android动态设置主题(使用RBus模式)

之前写过一篇文章: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,其他主题颜色类似

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

参考:
https://github.com/lguipeng/Notes

关键字:android, theme, rxandroid


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部