¿Alguien puede explicar el attr?

89

Estoy mirando el código de muestra de Honeycomb Gallery ( aquí ) y encontré el siguiente código mientras intentaba agregar elementos de acción en mi propia aplicación:

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

El ?attryo es tirar de un bucle. ¿Alguien puede explicar qué está haciendo esto? ¿Cómo se relaciona esto con un dibujo? Parece que no puedo encontrar ninguna buena información en Google. ¿También hay una lista o galería de atributos que podemos usar para iconos en lugar de solo menuIconCamera?

Gracias

Editar: miré un poco más y encontré que attrs.xml se ve así:

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

Desafortunadamente, eso solo lo hace aún más confuso para mí. ¿Qué está haciendo esto?

FuegoFingers
fuente

Respuestas:

64

El ?attr/menuIconCameravalor significa que menuIconCamerase utilizará un icono del atributo del tema actual.

Debe haber un dibujable asignado al menuIconCameraatributo en algún lugar del themes.xmlarchivo. Si hay dos temas con diferentes valores de este atributo, el icono real dependerá del tema que se esté utilizando actualmente.

El attrs.xmlarchivo se utiliza para definir atributos personalizados. Sin esta definición, el compilador tratará los atributos desconocidos como erróneos.

Miguel
fuente
1
tienes toda la razón, <item name = "menuIconCamera"> @ drawable / ic_menu_camera_holo_light </item>, muchas gracias. Veo que ic_menu_camera_holo_light es un dibujable local. ¿3.x no tiene íconos públicos integrados como los tenía 2.x?
FuegoFingers
No creo que esté conectado de alguna manera a la versión de Android. Esta es solo una forma de hacer que los atributos dependan de un tema elegido.
Michael
51

La ?attr:sintaxis se utiliza para acceder a los atributos del tema actual. Consulte los atributos de estilo de referencia .

Peter Knego
fuente
3
El enlace proporcionado fue muy, muy útil. ¡Gracias!
sven
3
Muy útil, pero aún debe publicar las partes principales de ese enlace.
gustavohenke
1
Esta fue la parte más útil del artículo vinculado: 'Un recurso de atributo de estilo le permite hacer referencia al valor de un atributo en el tema aplicado actualmente. Hacer referencia a un atributo de estilo le permite personalizar el aspecto de los elementos de la IU diseñándolos para que coincidan con las variaciones estándar proporcionadas por el tema actual, en lugar de proporcionar un valor codificado. Hacer referencia a un atributo de estilo básicamente dice, "usa el estilo que está definido por este atributo, en el tema actual" '.
bigtex777
24

Sé que esta publicación es muy antigua, pero creo que la siguiente explicación ayudará a los principiantes a comprenderla fácilmente.

Entonces, en términos sencillos,

someAttribute="?attr/attributeName" significa -

establecer el valor de someAttribute a lo que sea el valor de attributeName en el tema actual

Un ejemplo común ocurre al diseñar una barra de herramientas

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

Aquí el valor de android:backgroundse establecerá en @color/primary_colorporque se ?attr/colorPrimaryrefiere al @color/primary_colortema actual (AppTheme)

sziraqui
fuente
16

Mi inglés no es bueno, lo siento. Pero yo se esta pregunta

android:icon="?attr/menuIconCamera" quiero usar

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>

utilizar @drawable/ic_menu_camera_holo_light

amanecer
fuente
4

Esto es para referir atributos de estilo. ver R.attr

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

Hacer referencia a atributos de estilo

Michele
fuente
3
Una cosa que no parece estar documentada en ninguna parte es que '<nombre_paquete>' es el nombre completo del paquete de lo que sea que se declaró el recurso. Más específicamente, no es un prefijo de espacio de nombres XML, aunque la sintaxis podría sugerirlo. Por ejemplo, para hacer referencia a un atributo declarado por la biblioteca appcompat, use android.support.v7.appcompat:.
Deja de dañar a la comunidad
4

Esta publicación de blog hace un trabajo increíble al analizar cómo hacer referencia a los valores de los atributos de estilo que se definen en el tema actual: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/

  • Cuando ve la ?notación, significa que estamos tratando de hacer referencia a un atributo de estilo, un valor que puede variar según el tema actual. En cada tema específico podemos anular este atributo, por lo que no es necesario cambiar el diseño XML y se debe aplicar el tema correcto.

  • Cuando vea la @notación, hacemos referencia al valor real del recurso (color, cadena, dimensión, etc.). Este recurso debe tener un valor real. En este caso, sabemos exactamente con qué valor estamos tratando.

He aquí un ejemplo:

    <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>
nazmul idris
fuente