91

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

<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>

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

4

6 回答 6

65

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

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

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

于 2011-09-21T18:47:54.467 回答
51

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

于 2011-09-21T18:54:18.583 回答
25

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)

于 2017-03-08T17:30:34.933 回答
17

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

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>

样式.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

于 2011-12-27T09:31:39.087 回答
4

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

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

引用样式属性

于 2011-09-21T18:55:05.360 回答
4

这篇博文在如何引用当前主题中定义的样式属性的值方面做得非常出色: https ://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/

  • 当您看到?符号时 - 这意味着我们正在尝试引用样式属性 - 该值可能会因当前主题而异。在每个特定主题中,我们都可以覆盖此属性,因此不需要更改 XML 布局,并且需要应用正确的主题。

  • 当您看到@符号时 - 我们引用实际资源值(颜色、字符串、尺寸等)。该资源应具有实际价值。在这种情况下,我们确切地知道我们正在处理什么值。

这是一个例子:

    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="LauncherButton" parent="TextAppearance.AppCompat.Medium">
        <item name="android:textColor">?colorAccent</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_centerHorizontal">true</item>
        <item name="android:textAllCaps">false</item>
    </style>
于 2018-11-20T22:06:33.150 回答