通过EventBus更换android app主题
来源:互联网 发布:网络高清摄像机演示 编辑:程序博客网 时间:2024/05/17 23:22
在设置界面切换主题,是许多app必备的功能,可以在style.xml文件中写好样式,然后在代码中使用setTheme()可以动态切换整个application的主题。具体步骤:
1、准备好要切换的style
style.xml文件:
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> </style> <!-- 白天模式--> <style name="BaseAppThemeDay" parent="Theme.AppCompat.Light"> <item name="colorPrimary">@color/colorPrimaryDay</item> <item name="colorPrimaryDark">@color/colorPrimaryDarkDay</item> <item name="colorAccent">@color/colorAccentDay</item> <item name="statusBarColor">@color/statusBarColorDay</item> <item name="android:windowBackground">@color/windowBackgroundDay</item> <item name="android:textColorPrimary">@color/textColorPrimaryDay</item> </style> <!-- 夜间模式--> <style name="BaseAppThemeNight" parent="Theme.AppCompat"> <item name="colorPrimary">@color/colorPrimaryNight</item> <item name="colorPrimaryDark">@color/colorPrimaryDarkNight</item> <item name="colorAccent">@color/colorAccentNight</item> <item name="android:textColorPrimary">@color/textColorPrimaryNight</item> <item name="statusBarColor">@color/statusBarColorNight</item> <item name="android:windowBackground">@color/windowBackgroundNight</item> </style></resources>
colors.xml文件:
<?xml version="1.0" encoding="utf-8"?><resources> <color name="colorPrimaryDay">#4876FF</color> <color name="colorAccentDay">#ffffff</color> <color name="colorPrimaryDarkDay">#3A5FCD</color> <color name="textColorPrimaryDay">#00ff00</color> <color name="statusBarColorDay">#3A5FCD</color> <color name="windowBackgroundDay">#888888</color> <color name="colorPrimaryNight">#000000</color> <color name="colorPrimaryDarkNight">#3C3C3C</color> <color name="colorAccentNight">#4876FF</color> <color name="textColorPrimaryNight">#00ff00</color> <color name="statusBarColorNight">#3C3C3C</color> <color name="windowBackgroundNight">#3C3C3C</color></resources>
说明:这里是最普通的两套样式,白天模式和夜间模式,当然了,颜色是我自己乱写的,比较丑。。。
2、写一个BaseActivity,application中的所有activity都继承这个activity,这样,修改整个application主题的操作setTheme()放到这个activity实现,每个activity启动时,在onCreate()方法里只需要调用super.onCreate()方法即可同时修改样式。
BaseActivity可以这样写,这里不用为它设置布局文件,因为它根本不需要呈现出来,我们只是为了扩展它,使用theme而已,注意,如果有布局文件的activity需要设置样式,setTheme()方法必须放在setContentView()方法之前,否则样式设置无效:
import android.content.SharedPreferences;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences preferences = getSharedPreferences("style",MODE_PRIVATE); int themeId = preferences.getInt("theme",0); if (themeId == 1){ setTheme(R.style.BaseAppThemeDay); }else if (themeId == 2){ setTheme(R.style.BaseAppThemeNight); } }}
3、在设置界面SettingActivity设置app主题,同时将主题添加一个标记,存储到SharedPreferences里面,然后BaseActivity每次判断标记设置对应的主题就OK了,setTheme()还有一个需要注意的地方就是activity必须使用recreate()重启才能生效,那么在设置界面设置好主题后怎样通知用户之前浏览的界面重启呢,我采用了EventBus,具体使用方法,见http://blog.csdn.net/harvic880925/article/details/40660137,很感谢作者,这里我就不再赘述,因为作者讲的很好了,反而我还有很多不清楚的,还得继续学习。
新建一个事件类,我觉得主要就是事件订阅和发布的桥梁,我是这样写的,只有一个方法getMsg():
public class ChangeEvent { private String msg; public ChangeEvent(String msg){ this.msg = msg; } public String getMsg() { return msg; }}
SettingActivity的核心代码:
public void onClick(View v) { preferences = getSharedPreferences("style",MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); switch (v.getId()){ case R.id.day: setTheme(R.style.BaseAppThemeDay); editor.putInt("theme", 1); editor.commit(); SettingActivity.this.finish(); EventBus.getDefault().post(new ChangeEvent("change")); break; case R.id.night: setTheme(R.style.BaseAppThemeNight); editor.putInt("theme", 2); editor.commit(); SettingActivity.this.finish(); EventBus.getDefault().post(new ChangeEvent("change")); break; } }
3、在需要跳转的界面首先在onCreate()方法里注册EventBus,在onDestory()方法里注销,同时重写onEventMainThread()方法:
//注册EventBus EventBus.getDefault().register(this);
EventBus.getDefault().unregister(this);//注销
public void onEventMainThread(ChangeEvent event){ String msg = event.getMsg(); if (msg.equals("change")){ this.recreate(); } }
这样如果在设置界面设置了主题,返回之前界面的时候,activity经过重启,主题生效。效果图如下:
好了,就写到这里吧,感觉自己太差劲了,继续学习,fighting~~
- 通过EventBus更换android app主题
- android app换肤(更换主题)
- Android主题更换机制
- Android Studio 更换主题
- 更换Android Studio主题
- Android 主题的更换支持在线主题
- android 更换皮肤(主题)
- Android主题更换简单实践
- Android studio更换主题、背景图片
- 通过appearance设置app主题
- Android app主题切换
- android更改app主题
- 更换主题
- 轻松实现Android 更换皮肤(主题)
- 轻松实现Android 更换皮肤(主题)
- 轻松实现Android 更换皮肤(主题)
- 轻松实现Android更换皮肤(主题)
- android studio怎么更换默认主题?
- crossApp初级-类的结构-2
- Java 堆内存模型
- 机器学习课程 Multivariate Linear Regression(多变量线性回归)
- 计算机视觉、机器学习相关领域论文和源代码大集合(非常实用)
- Activity的几种启动模式介绍
- 通过EventBus更换android app主题
- eclipse调试技巧
- 每个程序员需掌握的20个代码命名小贴士
- C++ bitset详细解析
- codeforces 560 C Gerald's Hexagon
- BC430-Unit2:Data Types in the ABAP Dictionary
- Android中内容观察者的使用---- ContentObserver类详解
- 股票学习(K线分析)
- Unity官方教程学习笔记之Roll A Ball篇---(一)创建工程和保存场景