资源引用作为未考虑资源限定的属性值

时间:2017-07-15 17:34:57

标签: android android-appcompat android-resources android-theme

假设与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?我想听听有关这方面的一些想法。

1 个答案:

答案 0 :(得分:0)

很遗憾,但是假设对Configuration进行按位操作仍然是提供夜间主题的常规方法。查看示例:https://gist.github.com/slightfoot/c508cdc8828a478572e0