黑白模式适配

497 阅读1分钟

转移方式有两种:

1.drawable:放白天资源 drawable-night:放黑夜资源 这种方式需要原本黑夜的资源迁移到drawable-night下

2.drawable:放黑夜资源 drawable-notnight:放白天资源 这种只需要将新增的白天资源文件放到drawable-notnight中

img_v3_0287_c16eee57-b0fc-42dc-bd04-25f5f19c432g.jpg

需求背景

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)
    }
}