Android中主题切换简单实践(2)

这里切换主题后调用recreate()方法来重启Activity来实现主题的切换,非常简单,下面我们来看看效果,如下:

这里写图片描述

这里可以看的Button的颜色发生了改变,说明切换主题成功,这里也暴露一个非常致命的缺点就是重建Activity正规页面会闪一下,体验是相当不好的,当然也有解决办法,请参考开头提到的三种方式中其他方式,这里就不说了。如果你的Activity的生命周期做了很多其他操作,那么重启Activity就会带来很多麻烦,谨慎使用。如果你的应用可以容许有这样的体验,那就可以尝试一下了。

抽取BaseActivity

BaseActivity.java

public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (MyApp.getInstance().getGlobleTheme() == MyApp.THEME_LIGHT) { setTheme(R.style.AppTheme_Light); } else { setTheme(R.style.AppTheme_Night); } } }

这个里面只是判断当前主题是日间还是夜间模式,然后选择显示什么主题,下面看下MyApp的实现。
MyApp.java

public class MyApp extends Application { public static final int THEME_NIGHT = 0; public static final int THEME_LIGHT = 1; private static MyApp _instance; @Override public void onCreate() { super.onCreate(); _instance = this; } public static MyApp getInstance() { return _instance; } public SharedPreferences getGlobleSp() { return getSharedPreferences("config", Context.MODE_PRIVATE); } public int getGlobleTheme() { return getGlobleSp().getInt("theme", THEME_NIGHT); } public void changeGlobleTheme() { getGlobleSp().edit().putInt("theme", getGlobleTheme() == THEME_LIGHT ? THEME_NIGHT : THEME_LIGHT).commit(); } }

这里用SharePerferences来保存选择的主题。
AndroidManifest.xml 配置MyApp

<application android:name=".MyApp"

配置MyApp即可。

遇到的一个坑

当我们不在MainActivity里切换主题,而是SettingActivity里切换主题,再回到MainActivity会发现MainActivity根本不会变,这是因为主题的设置是在onCreate里进行的,这就导致,一些已经启动的Activity无法切换主题,如下:

这里写图片描述


这个效果可以很明显的看出BUG来,

当我在MainActivity里切换主题很正常

当我在SettingActivity里切换主题再回到MainActivity里发现主题没变

这里暂时只有一个MainActivity没有变,要是存在其他的过时的Activity也会存在这种办法。

解决

当我在SettingActivity里切换主题的时候,重新启动MainActivity,并把MainActivity的启动模式设置为SingleTask,并且还清空说有的其他在后台的Activity如下:

设置MainActivity的启动模式:

这里写图片描述

SettingActivity.java里的切换主题的点击事件如下:

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //用sp来保存当前是显示的哪个主题 MyApp.getInstance().changeGlobleTheme(); finish(); Intent intent = new Intent(SettingActivity.this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); overridePendingTransition(0, 0); } });

效果如下:

这里写图片描述

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9df031bbcc039e1b4b0511c0ba7c2003.html