如何通过r. attrr . colorprimary访问主题颜色属性?



我正在使用Android Studio Electric Eel,我从一个新的" Basic activity "开始;项目。它有一个明亮和黑暗的主题,/res/values/theme.xml/res/values-night/theme.xml

<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.Example" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<item name="colorPrimary">@color/md_theme_light_primary</item>
</style>
</resources>

我明白我需要使用这个代码:

val typedValue = TypedValue()
view.context.theme.resolveAttribute(R.attr.colorPrimary, typedValue, true)
val colorPrimary = typedValue.data

几乎可以。无论出于何种原因,R.attr.colorPrimary不会解析为默认的com.example.project.R,即我的本地项目。当我输入R.attr.colorPrimary时,它只能自动完成解析到com.google.android.material.R.attr.colorPrimary(它也可以解析到一些androidx组件,也可以工作)

当我使用它时,它确实工作,并且它确实使用我的color .xml指向我的theme.xml。我只是想了解为什么它不能简单地从theme.xml中解析。在我在网上找到的所有示例中,它都被命名为styles.xml,所以我将其重命名为,并且一切都一样,没有变化。

当我ctrl-click已解决的颜色,它带我到一个缓存文件在…transformedappcompat-1.6.1resvaluesvalues.xml这是<attr format="color" name="colorPrimary"/>

如果我按ctrl键点击parent="Theme.MaterialComponents.DayNight.DarkActionBar",它会带我到一个缓存…transformedmaterial-1.8.0resvaluesvalues.xml

我只是想知道为什么。似乎我的颜色仍然覆盖默认的,它使用com.google.android.material.R工作。在xml布局中,?attr/colorPrimary工作得很好。但是,在我所看到的任何地方,它都没有说,当以编程方式解析它时,它需要这个路径。

这几乎有效。无论出于何种原因,r.t attr.colorprimary不会解析出默认的com.example.project.R,这是我的本地项目。

那是因为colorPrimary不是您在本地项目中定义的属性。这是一个在材质库中定义的属性。

当我使用它时,它确实工作,并且它确实使用我的color .xml指向我的theme.xml。我只是想了解为什么它不能简单地从我的theme.xml中解析。

属性不能"解析"[your] theme.xml。属性在attrs.xml文件中定义,就像颜色或尺寸一样。您没有定义它,因此它不存在。

当你在themes.xml文件中使用它时,如下所示:

<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.Example" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<item name="colorPrimary">@color/md_theme_light_primary</item>
</style>
</resources>

您正在扩展现有的材料主题(parent属性)并设置已经在该主题中定义的colorPrimary属性。您没有声明自己的colorPrimary属性。如果您没有将parent属性设置为具有colorPrimary的主题,您将得到一个错误。

在我在网上找到的所有例子中,它被命名为styles.xml,所以我把它重命名为,一切都一样,没有变化。

正确-文件名不相关。

当我ctrl-click已解决的颜色,它带我到一个缓存文件在…transformedappcompat-1.6.1resvaluesvalues.xml这是

如果我ctrl-click parent= Theme.MaterialComponents.DayNight.DarkActionBar"它带我到一个缓存…transformedmaterial-1.8.0resvaluesvalues.xml

Android主题通过XML是一个复杂的嵌套覆盖网络。colorPrimary作为一个概念是在第一个"应用程序兼容"中与材料设计一起引入的。库。此后,它被更新和增强了专用的材料库,扩展了原始的并重新定义了值,以遵守最新的材料指南。

我只是想知道为什么。似乎我的颜色仍然覆盖默认的,它使用com.google.android.material.R工作。在xml布局?attr/colorPrimary工作得很好。但是,在我所看到的任何地方,它都没有说,当以编程方式解析它时,它需要这个路径。

总之,colorPrimary是一个由appcompat和material design库定义的主题属性,所以它存在于它们的包中。

在XML中,?attr/colorPrimary引用当前主题,在您的示例中将是" theme . example ",您已经声明将colorPrimary设置为@color/md_theme_light_primary

但是,在代码中,colorPrimary只是一个常量,必须解析以澄清在您引用的所有已定义的colorPrimary中,是哪个。最终,在代码中使用哪个包访问colorPrimary并不重要——它的将解析为您在主题中设置的值。