Android Studio 如何通过R.attr.colorPrimary访问主题颜色属性

g6ll5ycj  于 2023-04-07  发布在  Android
关注(0)|答案(1)|浏览(376)

我正在使用Android Studio Electric Eel,我从一个新的“基本活动”项目开始。它带有一个明暗主题,/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组件,这也可以工作)
当我使用它时,它确实工作,并且它确实使用了从theme.xml指向的colors.xml。我只是想理解为什么它不能简单地从theme.xml解析。在我在网上找到的所有示例中,它都被命名为styles.xml,所以我将其重命名为styles.xml,并且一切工作相同,没有变化。
按住Ctrl键并单击解析的颜色时,它会将我带到...\transformed\appcompat-1.6.1\res\values\values.xml中的一个缓存文件,即<attr format="color" name="colorPrimary"/>
如果按住Ctrl键并单击parent="Theme.MaterialComponents.DayNight.DarkActionBar",它会将我带到...\transformed\material-1.8.0\res\values\values.xml的缓存
我只是想弄明白为什么。看起来我的颜色仍然覆盖了默认的颜色,它使用com.google.android.material.R工作。在xml布局中,?attr/colorPrimary工作得很好。但是在我看的任何地方,它都没有说当编程解析时需要那个路径。

kd3sttzy

kd3sttzy1#

不管出于什么原因,R.attr.colorPrimary不会解析掉默认的com.example.project.R,这是我的本地项目。
这是因为colorPrimary不是在本地项目中定义的属性,而是在材质库中定义的属性。
当我使用它时,它确实工作了,它确实使用了从theme.xml指向的colors.xml。
属性不会“从[您的] 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,所以我将其重命名为styles.xml,所有内容都相同,没有变化。
对-文件名无关紧要。
当我按住Ctrl键并单击解析的颜色时,它会将我带到...\transformed\appcompat-1.6.1\res\values\values.xml中的缓存文件,该文件是
如果我按住Ctrl键单击parent=“Theme.MaterialComponents.DayNight.DarkActionBar”,它会将我带到...\transformed\material-1.8.0\res\values\values.xml的缓存
colorPrimary作为一个概念是在Material design的第一个“app compat”库中引入的。它已经通过专用的Material库进行了更新和增强,这些库扩展了原始的,并重新定义了值,以遵守最新的Material Guidelines。
我只是想知道为什么。似乎我的颜色仍然覆盖默认的,它使用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并不重要-它的 value 将解析为您在主题中设置的内容。

相关问题