studio programacion herramientas fundamentos con avanzado aplicaciones android

android - programacion - ¿Cómo aplico un estilo programáticamente?



manual de android en pdf (5)

Tengo un estilo llamado Rojo y Verde y tengo una sentencia if para saber cuál aplicar, pero no sé el código para aplicar un estilo desde Java.


Descubrí que esto solo se puede hacer al crear una Vista desde dentro de Java. Si está definido de antemano en el XML, no puede cambiar dinámicamente el estilo.


Es posible aplicar estilos programáticamente a TextViews utilizando el método setTextAppearance (context, resid). (El resultado del estilo se puede encontrar en R.style.YourStyleName)


No hay una solución de una sola línea para este problema, pero esto funcionó para mi caso de uso. El problema es que el constructor ''View (context, attrs, defStyle)'' no se refiere a un estilo real, quiere un atributo. Entonces, nosotros:

  1. Definir un atributo
  2. Crea un estilo que quieras usar
  3. Aplica un estilo para ese atributo en nuestro tema.
  4. Crea nuevas instancias de nuestra vista con ese atributo.

En ''res / values ​​/ attrs.xml'', defina un nuevo atributo:

<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="customTextViewStyle" format="reference"/> ... </resources>

En res / values ​​/ styles.xml ''voy a crear el estilo que quiero usar en mi TextView personalizado.

<style name="CustomTextView"> <item name="android:textSize">18sp</item> <item name="android:textColor">@color/white</item> <item name="android:paddingLeft">14dp</item> </style>

En ''res / values ​​/ themes.xml'' o ''res / values ​​/ styles.xml'', modifique el tema para su aplicación / actividad y agregue el siguiente estilo:

<resources> <style name="AppBaseTheme" parent="android:Theme.Light"> <item name="@attr/customTextViewStyle">@style/CustomTextView</item> </style> ... </resources>

Finalmente, en su TextView personalizado, ahora puede usar el constructor con el atributo y recibirá su estilo. Aquí, en lugar de siempre.

public class CustomTextView extends TextView { public CustomTextView(Context context, int styleAttribute) { super(context, null, styleAttribute); } // You could also just apply your default style if none is given public CustomTextView(Context context) { super(context, null, R.attr.customTextViewStyle); } }

Con todos estos componentes, ahora puede hacer una sentencia if / else para generar nuevas vistas en tiempo de ejecución con el estilo que prefiera

CustomTextView ctv; if(useCustomStyles == true){ ctv = new CustomTextView(context, R.attr.customTextViewStyle); }else{ ctv = new CustomTextView(context, R.attr.someOtherStyle); }

Vale la pena notar que repetidamente usé customTextView en diferentes variantes y diferentes lugares, pero no es de ninguna manera necesario que el nombre de la vista coincida con el estilo o el atributo o algo. Además, esta técnica debería funcionar con cualquier vista personalizada, no solo con vistas de texto.


Puede utilizar la nueva biblioteca de París para aplicar estilos mediante programación:

Paris.style(yourView).apply(condition ? R.style.Green : R.style.Red);

La única advertencia es que no todos los atributos son compatibles (pero muchos lo son y el soporte se puede agregar con bastante facilidad al contribuir a la biblioteca).

Descargo de responsabilidad: Soy el autor original de la biblioteca.


pon este código

super.setStyle(R.style.yourownstyle)

antes de setContentView () en onCreate