转移方式有两种:
1.drawable:放白天资源 drawable-night:放黑夜资源 这种方式需要原本黑夜的资源迁移到drawable-night下
2.drawable:放黑夜资源 drawable-notnight:放白天资源 这种只需要将新增的白天资源文件放到drawable-notnight中
需求背景
Android原生uiMode的方式实现日夜模式依赖Activity重启(参考Handle configuration changes),但实际业务中大多不希望重启Activity,这样不需要处理复杂的数据和状态的保存和恢复,也能获得更好的交互体验。如果不希望Activity重启,则需要在AndroidManifest.xml中声明android:configChanges="uiMode"属性,
<activity
android:name=".MainActivity"
android:exported="true"
android:configChanges = "uiMode"
android:launchMode="singleInstance"
android:resizeableActivity="true" />
此时Activity在切换日夜模式时不会重启,当然也不会跟随切换,而是收到onConfigurationChanged回调,
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// 手动切换uiMode的逻辑
}
那么Activity必须 继承 AppCompatActivity。
- 在Activity的
onNightModeChanged回调里处理日夜模式切换事件,
override fun onNightModeChanged(mode: Int) {
super.onNightModeChanged(mode)
// 通知组件库组件刷新日夜模式
}
- 如果渲染View使用的context是ApplicationContext,那么切换日夜模式不会影响这个Context,需要手动更新ApplicationContext
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
Application.context.resources.apply {
updateConfiguration(newConfig, displayMetrics)
}
}