2012-06-22 19 views
12

Estoy intentando diseñar botones para que se parezcan a los que pido en Android Full Width ICS style Minimalist Bottom ButtonsViews.Estilos de Android: diferencia entre 'style = "@ android: style/XYZ"' y 'style = "? Android: attr/XYZ"'?

que he tenido éxito, con el siguiente código XML 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. El contenido del eclipse ayudar tiene ni idea de lo que está pasando con la siguiente resolución de recursos:

style="?android:attr/buttonBarButtonStyle"

Estoy familiarizado con la resolución típica (que el contenido de Eclipse Assist es consciente de)

[email protected]/style/...

... pero no tengo clara 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 nada:

[email protected]:attr/buttonBarStyle

y tampoco lo hace esto:

style="@android:style/buttonBarStyle

así que supongo aquí dos cuestiones:

  1. Por qué la diferencia en la sintaxis de referencia de recursos?
  2. Por qué la categoría errónea confusa de estilos en una categoría de attr.
  3. ¿Para qué sirve la categoría nueva?

¡Gracias!

Respuesta

13

De another answer el SO (parafraseado aquí):

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

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

Referencing Style Attributes

1

androide: attr/buttonBarButtonStyle o simplemente androide:?? ButtonBarButtonStyle - (attr es opcional)

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

Esto elimina referencias internamente para @android: Estilo/Widget.Button que se define en el archivo appcompat/res/values ​​/ themes.xml.

(? Android :) - siempre enlaza con el valor del atributo del tema actual aplicado. Por lo tanto, nos permite referirnos al estilo definido de Android solo en lugar de crear uno nuevo y proporcionar un valor codificado.

Google Doc dice, "It uses the style that is defined by this attribute, in the current theme"

Cuestiones relacionadas