【问题标题】: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)
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 2017-11-17
        • 1970-01-01
        • 2022-11-10
        • 2019-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-29
        相关资源
        最近更新 更多