有人可以解释attr吗?

时间:2011-09-21 18:44:03

标签: android android-layout attributes android-theme

我正在查看Honeycomb Gallery示例代码(here),在尝试在我自己的应用中添加操作项时,我遇到了以下代码:

<item android:id="@+id/camera"
    android:title="Camera"
    android:icon="?attr/menuIconCamera"
    android:showAsAction="ifRoom" />

?attr让我失去了一个循环。有人可以解释一下这是做什么的吗?这与抽象有什么关系?我似乎无法在Google上找到任何有用的信息。还有一个我们可以用于图标的列表或图库,而不仅仅是menuIconCamera

由于

编辑: 我做了一些调查,发现attrs.xml看起来像这样:

<resources>
<declare-styleable name="AppTheme">
    <attr name="listDragShadowBackground" format="reference" />
    <attr name="menuIconCamera" format="reference" />
    <attr name="menuIconToggle" format="reference" />
    <attr name="menuIconShare" format="reference" />
</declare-styleable>

不幸的是,这让我更加困惑。这是做什么的?

5 个答案:

答案 0 :(得分:58)

?attr/menuIconCamera值表示将使用当前主题的menuIconCamera属性中的图标。

必须在menuIconCamera文件中的某处为themes.xml属性分配一个drawable。如果有两个主题具有此属性的不同值,则实际图标将取决于当前使用的主题。

attrs.xml文件用于定义自定义属性。如果没有这个定义,编译器会将未知属性视为错误。

答案 1 :(得分:48)

?attr:语法用于访问当前主题的属性。请参阅referencing style attributes

答案 2 :(得分:20)

我知道这篇文章很老,但我觉得以下解释可以帮助初学者轻松理解。

所以用外行人的话来说,

someAttribute="?attr/attributeName"表示 -

  

someAttribute 的值设置为当前主题中 attributeName 的值

在设计工具栏样式时会出现一个常见的例子

<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/primary_color</item>
       //some more stuff here
</style>
<!-- custom toolbar style -->
<style name="myToolbar" parent="Widget.AppCompat.Toolbar">
      <item name="android:background">?attr/colorPrimary</item>
     //some code here
</style>

此处android:background的值将设置为@color/primary_color,因为?attr/colorPrimary指的是当前主题中的@color/primary_color(AppTheme)

答案 3 :(得分:4)

这是用于引用样式属性。见R.attr

?[<package_name>:][<resource_type>/]<resource_name>

Referencing style attributes

答案 4 :(得分:0)

此博客文章做了非常出色的工作,介绍了如何引用当前主题中定义的样式属性的值: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/

  • 当您看到.unit{ float: left; border: 1px solid #000000; width: 49%; clear: left; } .unit[data-value$="B"]{ float: right; clear: right; } .unit::before{ content: attr(data-value); } .division{ /* clear the float for the headers */ clear: both; }表示法时-表示我们正在尝试引用样式属性-值 视当前主题而定。在每个特定主题中,我们都可以覆盖此属性,因此 XML布局不需要更改,并且需要应用正确的主题。

  • 当您看到?表示法时-我们将参考实际资源值(颜色,字符串,尺寸, 等等)。该资源应具有实际值。在这种情况下,我们确切知道我们的价值 处理。

这是一个例子:

@