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 ?attr
yo 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?
fuente
La
?attr:
sintaxis se utiliza para acceder a los atributos del tema actual. Consulte los atributos de estilo de referencia .fuente
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 -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:background
se establecerá en@color/primary_color
porque se?attr/colorPrimary
refiere al@color/primary_color
tema actual (AppTheme)fuente
Mi inglés no es bueno, lo siento. Pero yo se esta pregunta
android:icon="?attr/menuIconCamera"
quiero usarattrs.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
fuente
Esto es para referir atributos de estilo. ver R.attr
?[<package_name>:][<resource_type>/]<resource_name>
Hacer referencia a atributos de estilo
fuente
android.support.v7.appcompat:
.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>
fuente