V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Danmen123
V2EX  ›  Android

手机系统是日间模式, app 设置为黑暗模式, app 启动时的背景图片使用了日间模式的资源图片。如何设置让他可以加载和 app 主题符合的夜间模式的资源图片。

  •  
  •   Danmen123 · 2023-07-17 10:06:47 +08:00 · 8304 次点击
    这是一个创建于 495 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我的应用中同时支持日间模式和黑暗模式,同时用户也可以选择强制 app 为黑暗模式,有一个问题就是:
    启动 app 的时候,会显示通过 theme 的 android:windowBackground 属性中指向的图片资源,该资源是获取`value`还是`values-night`下的资源取决于手机系统当前是否为黑暗模式,而非 app 内是否为黑暗模式。

    我的需求:
    手机系统为日间模式,app 系统内为黑暗模式,我想启动页加载的是`value-night`中的主题资源,这样可以跟我 app 在显示启动页直到 app 加载完成显示主界面的视觉效果统一起来(都是深色系),用户体验会更好一些。

    尝试过的解决方案:
    在 Application `onCreate`方法中使用了`AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);`来设置应用的主题模式,但是并不会影响启动页的加载,失败了。

    请教各位大佬,有什么解决方案吗?
    第 1 条附言  ·  2023-07-17 13:30:14 +08:00
    xxx/values/themes 中的设置:
    <style name="Theme.XXXX" parent="android:Theme.Material.NoActionBar">
    ...
    // 这里使用的是浅色模式下的图片资源
    <item name="android:windowBackground">@drawable/launch_background_light</item>
    </style>

    xxx/values/themes-night 中的设置:
    <style name="Theme.XXXX" parent="android:Theme.Material.NoActionBar">
    ...
    // 这里使用的是深色模式下的图片资源
    <item name="android:windowBackground">@drawable/launch_background_dark</item>
    </style>

    应用中深色模式的实现:
    根据偏好设置中自己添加的一个属性 isDark 来判断是否是深色模式,如果是的话,则加载深色皮肤的 json 配置文件,然后应用到所有 View 组件中。

    目前应用启动之后,显示的状况为:
    1. 手机系统是浅色模式,app 也是浅色模式,应用启动之后,启动页(浅色) -> MainActivity (显示浅色皮肤我), 这是 OK 的情况
    2. 手机系统是深色模式,app 也是深色模式,应用启动之后,启动页(深色) -> MainActivity (显示深色皮肤), 这是 OK 的情况

    3. 手机系统是浅色模式,app 是深色模式,应用启动之后,启动页(浅色) -> MainActivity (显示深色皮肤), 这是有问题的,我希望启动页是深色的,同 activity 的皮肤保持一致
    4. 手机系统是深色模式,app 是浅色模式,应用启动之后,启动页(深色) -> MainActivity (显示浅色皮肤), 这是有问题的,我希望启动页是浅色的,同 activity 的皮肤保持一致

    第三种和第四种情况就是我目前碰到的问题,不知道是否有解决的方案,在 google 上搜了一圈,还没有看到类似的解决方案。
    17 条回复    2023-07-18 08:40:12 +08:00
    TArysiyehua
        1
    TArysiyehua  
       2023-07-17 10:34:32 +08:00
    高版本的 android 页是系统自带的,如果是那个页面的话要改就比较麻烦,如果是自己的启动也,在 attach 的时候用代码修改 context 与主题即可
    Danmen123
        2
    Danmen123  
    OP
       2023-07-17 10:41:16 +08:00
    @TArysiyehua 是 MainActivity 的 `onAttachedToWindow` 方法吗? 怎么修改 context 的主题呢?不是很理解,求大佬指教
    TArysiyehua
        3
    TArysiyehua  
       2023-07-17 11:15:48 +08:00
    @Danmen123 不是这个,另外看你的暗黑模式是怎么实现的丫,丢给 demo 出来,光说这些没啥用
    tromoli
        4
    tromoli  
       2023-07-17 12:05:12 +08:00
    主要得看深色模式是怎么实现的,是否在 values-night 中也设置了对应的深色模式启动页 theme
    Danmen123
        5
    Danmen123  
    OP
       2023-07-17 13:17:56 +08:00
    @TArysiyehua 我在偏好设置里面存了一个属性来判断用户是否启动了深色模式,应用启动的时候,我会根据这个属性来加载对应的浅色和深色的皮肤资源。没有用到任何系统给的属性。

    我目前遇到的这个问题,按照我的理解,跟我应用深色和浅色如何实现没有任何关系。我的需求是,如何在手机系统处于浅色模式的情况下,我的启动页(theme:windowBackground)加载的是`values-night`里面的`theme`资源,而不是直接使用的`values`里面 theme 的资源
    Danmen123
        6
    Danmen123  
    OP
       2023-07-17 13:20:18 +08:00
    @tromoli 我这里是使用的 android:windowBackground 设置的图片作为启动页,我在 values 和 values-night 里面分别设置了两个不同的图片资源(浅色和深色的图片 drawable )
    Danmen123
        7
    Danmen123  
    OP
       2023-07-17 13:29:33 +08:00
    xxx/values/themes 中的设置:
    <style name="Theme.XXXX" parent="android:Theme.Material.NoActionBar">
    ...
    // 这里使用的是浅色模式下的图片资源
    <item name="android:windowBackground">@drawable/launch_background_light</item>
    </style>

    xxx/values/themes-night 中的设置:
    <style name="Theme.XXXX" parent="android:Theme.Material.NoActionBar">
    ...
    // 这里使用的是深色模式下的图片资源
    <item name="android:windowBackground">@drawable/launch_background_dark</item>
    </style>

    应用中深色模式的实现:
    根据偏好设置中自己添加的一个属性 isDark 来判断是否是深色模式,如果是的话,则加载深色皮肤的 json 配置文件,然后应用到所有 View 组件中。

    目前应用启动之后,显示的状况为:
    1. 手机系统是浅色模式,app 也是浅色模式,应用启动之后,启动页(浅色) -> MainActivity (显示浅色皮肤我), 这是 OK 的情况
    2. 手机系统是深色模式,app 也是深色模式,应用启动之后,启动页(深色) -> MainActivity (显示深色皮肤), 这是 OK 的情况

    3. 手机系统是浅色模式,app 是深色模式,应用启动之后,启动页(浅色) -> MainActivity (显示深色皮肤), 这是有问题的,我希望启动页是深色的,同 activity 的皮肤保持一致
    4. 手机系统是深色模式,app 是浅色模式,应用启动之后,启动页(深色) -> MainActivity (显示浅色皮肤), 这是有问题的,我希望启动页是浅色的,同 activity 的皮肤保持一致

    第三种和第四种情况就是我目前碰到的问题,不知道是否有解决的方案,在 google 上搜了一圈,还没有看到类似的解决方案。
    TArysiyehua
        8
    TArysiyehua  
       2023-07-17 14:13:48 +08:00
    @Danmen123 根据偏好设置中自己添加的一个属性 isDark 来判断是否是深色模式,如果是的话,则加载深色皮肤的 json 配置文件,然后应用到所有 View 组件中

    你这个咋实现?应用到 view 过程中是在哪里设置判断的?明显就是 android:windowBackground 使用了系统了配置,你的配置没有操控到它。你具体咋实现不要光说,上具体的代码或者 demo 。
    Danmen123
        9
    Danmen123  
    OP
       2023-07-17 14:40:50 +08:00
    @TArysiyehua 应用到 view 系统的所有代码都是在
    // MainActivity

    fun onCreate() {
    super.onCreate()
    }
    Danmen123
        10
    Danmen123  
    OP
       2023-07-17 14:46:19 +08:00
    @TArysiyehua 都是在 Activity 的 onCreate 方法中进行皮肤的相关设置操作,这里不管你怎么设置,都是不会影响到启动页的加载流程的。。。老哥,您可能并没有遇到我说的这种问题,或者是不太了解,因为您关注的核心点跑偏了,不过还是很感谢你的热心回复
    TArysiyehua
        11
    TArysiyehua  
       2023-07-17 14:46:31 +08:00
    @Danmen123 那无法控制
    TArysiyehua
        12
    TArysiyehua  
       2023-07-17 14:48:05 +08:00
    @Danmen123 这个就是核心问题呀,主题的确定并不是在 Activity 的 onCreate 方法中,你在这里设置已经完了,系统已经决定用 themes-night 里的资源了。。。
    Danmen123
        13
    Danmen123  
    OP
       2023-07-17 14:55:02 +08:00
    @TArysiyehua 可能我说的主题把你迷惑了,你就忘掉我 app 里面主题的概念,我现在的需求就是,如果在手机系统为浅色模式的情况下,如何设置才可以让 app 在初始加载的时候,使用 values-night 里面的资源
    TArysiyehua
        14
    TArysiyehua  
       2023-07-17 15:13:44 +08:00
    @Danmen123 并没有迷惑我,我解决过这个问题。我已经说的很清楚了,是你自己太执拗,非要用系统自带的资源选择功能又不肯改代码。
    1. 首先主有闪屏有问题,因为你闪屏用你的并不是你的这套方案,闪屏使用的系统方案,这个你能理解吧
    2. 闪屏的 android:windowBackground 默认就是受到系统主题控制的,所以它就是会选择 night.xml 的资源
    3. 你现在非要它不选,那你就改掉闪屏、主题的背景图片,去掉它,自己手动设置闪屏背景图片,而不是用 android:windowBackground ,这样不就解决问题了?
    Danmen123
        15
    Danmen123  
    OP
       2023-07-17 15:43:13 +08:00
    @TArysiyehua 是的,您这个回答非常具有参考价值,我对第三点解决方案很感兴趣,应该在哪里进行修改呢?
    RikkaW
        16
    RikkaW  
       2023-07-17 17:48:03 +08:00
    别想了,不可能的,启动期间你的代码还没运行呢
    dabbit
        17
    dabbit  
       2023-07-18 08:40:12 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2416 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 01:59 · PVG 09:59 · LAX 17:59 · JFK 20:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.