2012-06-03 14 views
9

Estoy tratando de crear una interfaz de usuario de Android a través de diseños. Comienzo con lo siguiente:¿Cómo funciona un estilo android: attr?

<TextView 
    android:id="@+id/..." 
    android:layout_marginTop="8dip" 
    android:text="..." 
    style="?android:attr/listSeparatorTextViewStyle"/> 

Y eso se ve bien (todas las mayúsculas, fuente más pequeña, barra divisoria debajo de ella). Ahora quiero extender el estilo, así que lo cambio a lo siguiente:

<TextView 
    android:id="@+id/..." 
    android:layout_marginTop="8dip" 
    android:text="..." 
    style="@style/section_title"/> 

Con un estilo de:

<style name="section_title" parent="@android:attr/listSeparatorTextViewStyle"> 
    <item name="android:layout_width">fill_parent</item> 
    <item name="android:layout_height">wrap_content</item> 
</style> 

Y eso no funciona (la fuente es correcta, pero la línea divisoria se ha ido).

¿Cómo es que ... eso?

Respuesta

22

Cuando se está usando:

style="?android:attr/listSeparatorTextViewStyle" 

que está utilizando el estilo señalado por este atributo (listSeparatorTextViewStyle). Si observa en la plataforma themes.xml, verá que el estilo que se usa realmente para este atributo es Widget.TextView.ListSeparator.White. Así que este es el style que debe extender en su estilo personalizado.

Desafortunadamente ese estilo es privado y no puede extenderlo, o no debe extenderlo (para referencia, vea this bug report de google). Su mejor opción sería copiar ese estilo completo, Widget.TextView.ListSeparator.White (Widget.TextView.ListSeparator no es público, así que también tendría que copiar eso), en su estilo personalizado y usarlo en lugar de extender el estilo desde la plataforma de Android (consulte this response desde enlace arriba).

+1

Eso tiene total sentido ahora. Sin embargo, esto parece una solución fea. Para que coincida con el estilo del sistema tendré que tener un estilo (potencialmente) diferente para cada versión de Android, y si un fabricante cambió este estilo en el nombre de skinning, no tengo suerte y simplemente no podré coincide con el estilo del sistema para ese dispositivo. – Hounshell

+1

@Hounshell Puede usar un tema personalizado y establecer su propio estilo para el atributo 'listSeparatorTextViewStyle'. Con esto, tu propio estilo estará presente en todas las plataformas de Android. Por supuesto, esto aún te hará vulnerable al fabricante del teléfono cambiando algunos estilos (el único problema real es el atributo de fondo dibujable). No dice ** cómo ** exactamente su diseño usa este estilo, pero tenga en cuenta que los usuarios probablemente consideren algunas diferencias de UI en una aplicación. – Luksprog

+0

cómo encontrar que el ítem está apuntando? –

Cuestiones relacionadas