手机系统是日间模式, app 设置为黑暗模式, app 启动时的背景图片使用了日间模式的资源图片。如何设置让他可以加载和 app 主题符合的夜间模式的资源图片。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Danmen123
V2EX    Android

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

  •  
  •   Danmen123 2023-07-17 10:06:47 +08:00 11518 次点击
    这是一个创建于 824 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我的应用中同时支持日间模式和黑暗模式,同时用户也可以选择强制 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
    关于   &nbs; 帮助文档     自助推广系统     博客     API     FAQ     Solana     885 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 22:29 PVG 06:29 LAX 15:29 JFK 18:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86