假设与How to setup night mode drawables as expected
相关我尝试在Android应用中实施新的AppCompat DayNight主题,同时在设置中提供主题切换。
情景:
当使用所述主题开关时,"设置"活动通过调用AppCompatDelegate #setDefaultNightMode和AppCompatDelegate #applyDayNight(后者通过其getDelegate()方法可用于AppCompatActivity)重新创建。 文本颜色反转,背景改变,后箭头的颜色也改变了。到目前为止一切都很好。
当用户完成更改应用程序主题后,他将关闭活动并继续使用该应用程序。他期望发生什么?确切地说,主要活动也应该改变其主题。我们如何做到这一点?活动#在Activity#onActivityResult中重新创建。
对AppCompatDelegate#setDefaultNightMode的调用会触发配置的更改,该更改由AppCompatDelegate#applyDayNight应用,或者在另一个Activity解析其主题& Activity#onCreate中的配置。第一个适用于设置活动,第二个适用于现在正在发生的事情。
现在到关键部分:应用程序的资源被调度配置更改,现在正在检查其有效性(资源限定),如果失败,它们将从缓存中清除,以便新创建资源(在这种情况下,drawables),以充分反映新主题&组态。
现在正如我所说,设置活动中的后退箭头确实改变了它的颜色,但这不是我自己的drawable,它是getSupportActionBar.setDisplayHomeAsUpEnabled(true)的默认值。 然而,在主要活动中,我确实使用了我自己的drawables,例如菜单图标和其他ui元素。这些都没有改变。我使用矢量绘图,它从fillColor属性中获取颜色。
TL; DR
为了让DayNight主题适合我,我为我的应用程序中使用的某些颜色定义了主题属性,也为图标(drawables)定义了主题属性。这些属性由我使用的统一主题填充,并且指的是来自值 - 夜晚或值 - 不是夜晚的颜色,具体取决于当前配置。这是一个冗余的间接,但是当与默认主题属性(如textColorPrimary等)一起使用时,至少在我看来,它会产生更好的风格。
但是:事实证明,它并不起作用。走属性方式,那些属于最终颜色的属性会失去资源合格的质量(夜晚或非夜晚),因此传递"有效性测试"在配置更改时执行,即使这不是应该发生的事情。因此,在我改变了夜间模式之后,我最终得到了旧的错误的 drawables。
为了解决这个问题,我可以只是
将android:fillColor="?attr/myCustomAttributeColorXEitherNightOrNot"
替换为android:fillColor="@color/colorXEitherNightOrNot"
。
但这真的应该是这样的吗?我在这里缺少一些重要的属性 - 原理,还是一个bug?我想听听有关这方面的一些想法。
答案 0 :(得分:0)
很遗憾,但是假设对Configuration进行按位操作仍然是提供夜间主题的常规方法。查看示例:https://gist.github.com/slightfoot/c508cdc8828a478572e0