我正在查看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>
不幸的是,这让我更加困惑。这是做什么的?
答案 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)
答案 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布局不需要更改,并且需要应用正确的主题。
当您看到?
表示法时-我们将参考实际资源值(颜色,字符串,尺寸,
等等)。该资源应具有实际值。在这种情况下,我们确切知道我们的价值
处理。
这是一个例子:
@