有人可以解释attr吗?

我正在查看Honeycomb Gallery示例代码( 在这里 ),并尝试在我自己的应用中添加操作项时运行以下代码:

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

这个游戏正在把我扔?attr 。 有人可以解释这是做什么? 这与drawable有什么关系? 我似乎无法在Google上find任何有用的信息。 还有是我们可以使用的图标,而不是只是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> 

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

?attr/menuIconCamera值意味着将使用来自当前主题的menuIconCamera属性的图标。

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

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

?attr:语法用于访问当前主题的属性。 请参阅引用样式属性 。

我的英文不好,对不起。 但我知道这个问题

android:icon="?attr/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> </resources> 

styles.xml

 <style name="AppTheme.Light" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/ActionBar.Light</item> <item name="android:windowActionBarOverlay">true</item> <item name="listDragShadowBackground">@android:color/background_light</item> <item name="menuIconCamera">@drawable/ic_menu_camera_holo_light</item> //this.... <item name="menuIconToggle">@drawable/ic_menu_toggle_holo_light</item> <item name="menuIconShare">@drawable/ic_menu_share_holo_light</item> </style> 

使用@drawable/ic_menu_camera_holo_light

我知道这个post很老,但是我觉得下面的解释会帮助初学者很容易理解。

所以通俗地说,

someAttribute="?attr/attributName"表示set the value of **someAttribute** to whatever is the value of **attributeName**当前主题set the value of **someAttribute** to whatever is the value of **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指向当前主题(AppTheme)中的@color/primary_color

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

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

引用样式属性