Can someone explain the attr?

44,762

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>

Referencing style attributes

Share:
44,762
FuegoFingers
Author by

FuegoFingers

Resume/CV

Updated on November 21, 2020

Comments

  • FuegoFingers
    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 just menuIconCamera?

    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
    FuegoFingers over 12 years
    you are exactly right, <item name="menuIconCamera">@drawable/ic_menu_camera_holo_light</i‌​tem>, 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
    Michael over 12 years
    I don't think it's somehow connected to Android version. This is just a way of making attributes dependent on a chosen theme.
  • sven
    sven over 12 years
    The supplied link was very, very helpful. Thanks!
  • Stop Harming the Community
    Stop Harming the Community almost 10 years
    One 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
    gustavohenke over 8 years
    Very helpful, but you should still post the main parts of that link.
  • bigtex777
    bigtex777 over 7 years
    This 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."'