Can someone explain the attr?
Solution 1
The ?attr/menuIconCamera
value means that an icon from menuIconCamera
attribute of the current theme will be used.
There must be a drawable assigned to the menuIconCamera
attribute somewhere in the themes.xml
file. If there're two themes with different values of this attribute then actual icon will depend on a theme which is currently used.
The attrs.xml
file is used to define custom attributes. Without this definition compiler will treat unknown attributes as erroneous.
Solution 2
The ?attr:
syntax is used for accessing attributes of current theme. See referencing style attributes.
Solution 3
I know this post is very old, but I feel the following explanation will help beginners understand it easily.
So in layman's terms,
someAttribute="?attr/attributeName"
means -
set the value of someAttribute to whatever is the value of attributeName in current theme
A common example occurs in styling a Toolbar
<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>
Here value of android:background
will be set to @color/primary_color
because ?attr/colorPrimary
refers to @color/primary_color
in the current theme (AppTheme)
Solution 4
My English is not good, sorry. But I know this question
android:icon="?attr/menuIconCamera"
want use
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>
use @drawable/ic_menu_camera_holo_light
Solution 5
This is for refering style Attributes. see R.attr
?[<package_name>:][<resource_type>/]<resource_name>
Comments
-
FuegoFingers over 3 years
I am looking at the Honeycomb Gallery sample code (here) and I ran across the following code while trying to add action items in my own app:
<item android:id="@+id/camera" android:title="Camera" android:icon="?attr/menuIconCamera" android:showAsAction="ifRoom" />
The
?attr
is throwing me for a loop. Can someone please explain what this is doing? How is this related to a drawable? I can't seem to find any good information on Google. Also is there a listing or gallery of attributes we can use for icons instead of justmenuIconCamera
?Thanks
Edit: I did some more looking around and found that attrs.xml looks like this:
<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>
Unfortunately that just makes it even more confusing for me. What is this doing?
-
FuegoFingers over 12 yearsyou are exactly right, <item name="menuIconCamera">@drawable/ic_menu_camera_holo_light</item>, Thank you so much. I see that ic_menu_camera_holo_light is a local drawable. Does 3.x not have public icons built in like 2.x had?
-
Michael over 12 yearsI don't think it's somehow connected to Android version. This is just a way of making attributes dependent on a chosen theme.
-
sven over 12 yearsThe supplied link was very, very helpful. Thanks!
-
Stop Harming the Community almost 10 yearsOne thing that doesn't seem to be documented anywhere is that '<package_name>' is the full package name of whatever declared the resource. More specically, it's not an XML namespace prefix, even though the syntax might suggest that. For example to refer to an attr declared by the appcompat library, use
android.support.v7.appcompat:
. -
gustavohenke over 8 yearsVery helpful, but you should still post the main parts of that link.
-
bigtex777 over 7 yearsThis was the most helpful part of the linked article: 'A style attribute resource allows you to reference the value of an attribute in the currently-applied theme. Referencing a style attribute allows you to customize the look of UI elements by styling them to match standard variations supplied by the current theme, instead of supplying a hard-coded value. Referencing a style attribute essentially says, "use the style that is defined by this attribute, in the current theme."'