Android 夜间模式

比较几种夜间模式(主题切换)的实现

第一种

系统提供的 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