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