Estilos de Android: Diferencia entre 'style = "@ android: style / XYZ"' y 'style = "? Android: attr / XYZ"'?

Estoy tratando de estilo botones para parecerse a los que pregunto en Android Full Width ICS estilo Minimalista Bottom ButtonsViews .

He tenido éxito, con el xml siguiente para cualquier persona interesada:

<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="bottom" android:divider="@android:drawable/divider_horizontal_dark" android:gravity="bottom" android:orientation="vertical" android:paddingTop="16dip" android:showDividers="beginning|end" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:measureWithLargestChild="true" android:orientation="horizontal" android:divider="@android:drawable/divider_horizontal_dark" android:showDividers="middle" > <Button android:id="@+id/cancel_button" style="?android:attr/buttonBarButtonStyle" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_gravity="left" android:layout_weight="1" android:maxLines="2" android:text="@string/cancel_button" /> <Button android:id="@+id/login_button" style="?android:attr/buttonBarButtonStyle" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_gravity="right" android:layout_weight="1" android:filterTouchesWhenObscured="true" android:maxLines="2" android:text="@string/login_button" /> </LinearLayout> </LinearLayout> 

Una pregunta sin embargo. La ayuda de contenido de eclipse no tiene idea de qué está pasando con la siguiente resolución de recursos:

style="?android:attr/buttonBarButtonStyle"

Estoy familiarizado con la resolución típica (de la que la ayuda de contenido de eclipse es consciente)

style=@android/style/...

… pero no estoy claro sobre la diferencia entre los dos. Parece que algunos atributos de estilo aparecen en uno pero no en el otro. Por ejemplo, lo siguiente no se resuelve a nada:

style=@android:attr/buttonBarStyle

Y tampoco lo hace:

style="@android:style/buttonBarStyle

Así que supongo que dos preguntas aquí:

  1. ¿Por qué la diferencia en la sintaxis de referencia de recursos?
  2. ¿Por qué la confusión de miscategorization de estilos en bajo una categoría attr.
  3. ¿Para qué se utiliza la categoría attr?

¡Gracias!

De otra respuesta a SO (parafraseada aquí):

El uso de un signo de interrogación delante de un ID significa que desea acceder a un atributo de estilo que se define en un tema de estilo, en lugar de codificar el atributo de forma segura.

Piense en ello como desreferencia de un atributo de tema para buscar el recurso al que apunta en lugar de referirse al atributo en sí.

Referencia de los atributos de estilo

? Android: attr / buttonBarButtonStyle o simplemente ? Android: buttonBarButtonStyle – (attr es opcional)

 <item name="buttonBarButtonStyle">@android:style/Widget.Button</item> 

Esto internamente dereferences a @android: style / Widget.Button que se define dentro del archivo appcompat / res / values ​​/ themes.xml .

(? Android 🙂 – siempre enlaza con el valor del atributo del tema actual aplicado. Esto nos permite referirnos al estilo definido por android, creando uno nuevo y suministrando un valor codificado.

Google Doc dice: "Utiliza el estilo que se define por este atributo, en el tema actual"

  • Recursos de cadenas dinámicas de Android
  • ¿Existen convenciones sobre cómo nombrar los recursos?
  • Cambiar entre previsualización de referencia y valor de recursos de cadena en el editor xml
  • Estilo Sherlock Barra de Acción
  • Android: html en strings.xml
  • Establecer android: windowIsFloating programmatically
  • Xxhdpi densidad añadido en API 16, lo que en <16 si sólo proporcionar recursos xxhdpi?
  • Class.getResource (className) que me da NullPointerException
  • Recursos de referencia de otro módulo en Android Studio
  • Diseños específicos de densidad vs. diseños específicos de tamaño en Android
  • "R no se puede resolver a una variable"?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.