usar studio programacion móviles example descargar desarrollo curso como aplicaciones android android-theme

android - studio - Cómo: Definir elemento de tema(estilo) para widget personalizado



material design android example (2)

Otro aspecto además de la excelente respuesta de Michael es anular los atributos personalizados en los temas. Supongamos que tiene varias vistas personalizadas que se refieren al atributo personalizado "custom_background".

<declare-styleable name="MyCustomStylables"> <attr name="custom_background" format="color"/> </declare-styleable>

En un tema, define cuál es el valor

<style name="MyColorfulTheme" parent="AppTheme"> <item name="custom_background">#ff0000</item> </style>

o

<style name="MyBoringTheme" parent="AppTheme"> <item name="custom_background">#ffffff</item> </style>

Puede referirse al atributo en un estilo

<style name="MyDefaultLabelStyle" parent="AppTheme"> <item name="android:background">?background_label</item> </style>

Observe el signo de interrogación, como también se utiliza para el atributo android de referencia como en

?android:attr/colorBackground

Como la mayoría de ustedes han notado, pueden, y probablemente deberían, usar referencias @color en lugar de colores codificados.

¿Por qué no solo hacer

<item name="android:background">@color/my_background_color</item>

No puede cambiar la definición de "my_background_color" en tiempo de ejecución, mientras que puede cambiar fácilmente de tema.

He escrito un widget personalizado para un control que utilizamos ampliamente en toda nuestra aplicación. La clase de widget se deriva de ImageButton y la amplía de dos maneras simples. Definí un estilo que puedo aplicar al widget a medida que se usa, pero prefiero configurarlo a través de un tema. En R.styleable veo atributos de estilo de widget como imageButtonStyle y textViewStyle . ¿Hay alguna manera de crear algo así para el widget personalizado que escribí?


Sí, hay una forma:

Supongamos que tiene una declaración de atributos para su widget (en attrs.xml ):

<declare-styleable name="CustomImageButton"> <attr name="customAttr" format="string"/> </declare-styleable>

Declare un atributo que usará para una referencia de estilo (en attrs.xml ):

<declare-styleable name="CustomTheme"> <attr name="customImageButtonStyle" format="reference"/> </declare-styleable>

Declare un conjunto de valores de atributo predeterminados para el widget (en styles.xml ):

<style name="Widget.ImageButton.Custom" parent="android:style/Widget.ImageButton"> <item name="customAttr">some value</item> </style>

Declara un tema personalizado (en themes.xml ):

<style name="Theme.Custom" parent="@android:style/Theme"> <item name="customImageButtonStyle">@style/Widget.ImageButton.Custom</item> </style>

Utilice este atributo como tercer argumento en el constructor de su widget (en CustomImageButton.java ):

public class CustomImageButton extends ImageButton { private String customAttr; public CustomImageButton( Context context ) { this( context, null ); } public CustomImageButton( Context context, AttributeSet attrs ) { this( context, attrs, R.attr.customImageButtonStyle ); } public CustomImageButton( Context context, AttributeSet attrs, int defStyle ) { super( context, attrs, defStyle ); final TypedArray array = context.obtainStyledAttributes( attrs, R.styleable.CustomImageButton, defStyle, R.style.Widget_ImageButton_Custom ); // see below this.customAttr = array.getString( R.styleable.CustomImageButton_customAttr, "" ); array.recycle(); } }

Ahora tiene que aplicar Theme.Custom a todas las actividades que usan CustomImageButton (en AndroidManifest.xml):

<activity android:name=".MyActivity" android:theme="@style/Theme.Custom"/>

Eso es todo. Ahora CustomImageButton intenta cargar los valores de atributo predeterminados del atributo customImageButtonStyle del tema actual. Si no se encuentra dicho atributo en el tema o el valor del atributo es @null entonces se @null el argumento final para obtener los obtainStyledAttributes : Widget.ImageButton.Custom en este caso.

Puede cambiar los nombres de todas las instancias y todos los archivos (excepto AndroidManifest.xml ), pero sería mejor usar la convención de nomenclatura de Android.