我正在使用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
工作得很好。但是在我看的任何地方,它都没有说当编程解析时需要那个路径。
1条答案
按热度按时间kd3sttzy1#
不管出于什么原因,R.attr.colorPrimary不会解析掉默认的com.example.project.R,这是我的本地项目。
这是因为
colorPrimary
不是在本地项目中定义的属性,而是在材质库中定义的属性。当我使用它时,它确实工作了,它确实使用了从theme.xml指向的colors.xml。
属性不会“从[您的] theme.xml中解析”。属性在
attrs.xml
文件中定义,就像颜色或尺寸一样。您没有定义,因此它不存在。当您在
themes.xml
文件中使用它时,如下所示:您正在 * 扩展 * 现有的材质主题(
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 将解析为您在主题中设置的内容。