【问题标题】:System applies night mode to views added in service (TYPE_APPLICATION_OVERLAY), but how to apply night mode manually?系统将夜间模式应用于服务中添加的视图(TYPE_APPLICATION_OVERLAY),但如何手动应用夜间模式?
【发布时间】:2022-10-31 06:30:12
【问题描述】:
我有一个LinearLayout,我将它从服务中作为TYPE_APPLICATION_OVERLAY 充气并添加到屏幕上。当我从整个手机的系统设置更改主题时,此视图将更改为暗模式。但是当我想在我的应用程序中手动设置夜间模式时,这个视图不会改变。它只服从系统主题。
请注意,我还有一个启动服务的活动,并且手动为该活动设置暗/亮模式没有问题。但不影响服务视图,与系统主题保持一致。
作为参考,我在服务中尝试了AppCompatDelegate 方法,但它不起作用 + 加上我的活动失去了与服务的 serviceConnection。我还尝试使用新的ContextThemeWrapper 来扩展视图,但也不起作用。
底线:如何手动更改在前台/后台服务中添加的视图的主题?
【问题讨论】:
标签:
android-service
android-theme
android-night-mode
appcompatdelegate
type-application-overlay
【解决方案1】:
经过几天的研究和试验,我得出结论,这是不可能的。这一切都归结为服务中使用的上下文。根据this question 的许多详细答案,服务上下文无法使用自定义主题为布局充气,系统将始终使用默认系统主题对其进行充气。
如果有人找到方法,我会很乐意学习。
【解决方案2】:
试试看这里:https://gist.github.com/chrisbanes/bcf4b11154cb59e3f302f278902eb3f7
它对我有用
代码sn-p:
fun createNightModeContext(context: Context, isNightMode: Boolean): Context {
val uiModeFlag = if (isNightMode) Configuration.UI_MODE_NIGHT_YES else Configuration.UI_MODE_NIGHT_NO
val config = Configuration(context.resources.configuration)
config.uiMode = uiModeFlag or (config.uiMode and Configuration.UI_MODE_NIGHT_MASK.inv())
return context.createConfigurationContext(config)
}