比较几种夜间模式(主题切换)的实现
第一种
系统提供的 setTheme, 然后走 recreate ,方法比较简单粗暴。缺点:recreate 导致界面会闪烁。
第二种
系统提供的 AppCompatDelegate.setDefaultNightMode(int mode); 然后 recreate 。缺点同第一种方法,优点是夜间模式直接走 drawable-night、values-night 等 -night 的资源。
第三种
先 setTheme ,然后便利界面 ui,每个被标记的 view 重新设置颜色。优点:界面会闪烁。缺点需要标记view,遍历 view,还有考虑 view 缓存状态的刷新。
第四种
先 setTheme, 然后重建 fragment,通过 Fragment.SavedState state = FragmentManager().saveFragmentInstanceState(oldFragment)
保存旧的fragment状态,然后重新创建新的 fragment,最后 fragment.setInitialSavedState(state);
,再恢复状态。这种情况一般就是主界面一个MainActivity,然后界面套一个 MainFragment,这样,只需重新创建 fragment 就可以达到启用新的 theme。需要注意的地方: 保存数据的时候,大的数据不能通过 onSaveInstanceState 保存,一方面 bundle可能会超过大学,另一方面会有序列化/反序列化问题,可直接放在成员变量中。可参考官方文档在配置变更期间保留对象
使用系统提供的 setTheme 来切换主题有个好处, 就是可以直接在 Android Studio 中编写 xml 时预览效果.
文章来自: https://hanks.pub