2011-09-21 24 views
58

estoy mirando el código de ejemplo de nido de abeja Galería (here) y me encontré con el siguiente código al intentar añadir elementos de acción en mi propia aplicación:¿Alguien puede explicar el attr?

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

El ?attr mí es tirar de un bucle. ¿Puede alguien explicar por favor qué está haciendo esto? ¿Cómo se relaciona esto con un dibujable? Parece que no puedo encontrar 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: he hecho un poco más mirando a su alrededor y se 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> 

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

Respuesta

39

El valor ?attr/menuIconCamera significa que se utilizará un icono del atributo menuIconCamera del tema actual.

Debe haber un drawable asignado al atributo menuIconCamera en algún lugar del archivo themes.xml. Si hay dos temas con diferentes valores de este atributo, el ícono real dependerá del tema que se use actualmente.

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

+1

que tiene toda la razón, @ estirable/ic_menu_camera_holo_light, Gracias tanto. Veo que ic_menu_camera_holo_light es un dibujante local. 3.x no tiene iconos públicos integrados como 2.x tenía? – FuegoFingers

+0

No creo que de alguna manera esté conectado a la versión de Android. Esta es solo una manera de hacer que los atributos dependan de un tema elegido. – Michael

38

La sintaxis ?attr: se utiliza para acceder a los atributos del tema actual. Ver referencing style attributes.

+3

El enlace proporcionado fue muy, muy útil. ¡Gracias! – sven

+3

Muy útil, pero igual 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 interfaz de usuario al diseñarlos para que coincidan con las variaciones estándar proporcionadas por el tema actual, en lugar de proporcionar un valor codificado. La referencia a un atributo de estilo básicamente dice: "use el estilo definido por este atributo en el tema actual". ' – bigtex777

4

Esto es para los atributos de estilo de referencia. ver R.attr

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

Referencing style attributes

+3

Una cosa que no parece estar documentada en ninguna parte es que' 'es el nombre completo del paquete lo que sea que declaró el recurso. Más específicamente, no es un prefijo de espacio de nombres XML, aunque la sintaxis pueda sugerir eso. Por ejemplo, para hacer referencia a un attr declarado por la biblioteca appcompat, use 'android.support.v7.appcompat:'. – rockwalrus

13

Mi Inglés no es bueno, lo siento. Pero sé que esta pregunta

android:icon="?attr/menuIconCamera" quieren utilizar

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> 

uso @drawable/ic_menu_camera_holo_light

+0

Creo que esta es la respuesta más clara. – Clint

9

Sé que este post es muy antiguo, pero creo que la siguiente explicación ayudará a los principiantes entenderlo fácilmente

Así que en términos simples,

someAttribute="?attr/attributeName" significa -

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

Un ejemplo común se produce 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í valor de android:background se establecerá en @color/primary_color porque ?attr/colorPrimary se refiere a @color/primary_color en el tema actual (AppTheme)

Cuestiones relacionadas