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

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值