2011-02-19 20 views
19

Tengo un estilo llamado Rojo y Verde y tengo una declaración if para saber cuál presentar, pero no conozco el código para aplicar realmente un estilo del java.¿Cómo aplico un estilo programáticamente?

+6

duplicado exacto: http://stackoverflow.com/questions/2016249/how-to-programmatically-setting-style-attribute- en-una-vista, http://stackoverflow.com/questions/3246447/how-to-set-the-style-attribute-programmatically-in-android, etc. Por favor, busque antes de preguntar –

+0

este enlace. http://www.anddev.org/view-layout-resource-problems-f27/how-to-programmatically-set-button-style-t8656.html esto debería ayudar –

Respuesta

5

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

+5

¿Cómo responde esto su propia pregunta? –

12

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

31

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

  1. Definir un atributo
  2. crear un estilo que desea utilizar
  3. Aplicar un estilo para ese atributo en nuestro tema
  4. crear nuevas instancias de nuestra visión con ese atributo

En 'res/valores/attrs.xml', definir un nuevo atributo:

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

En res/valores/styles.xml 'Voy a crear el estilo que quiero usar en mi TextView encargo

<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/valores/themes.xml' o' res/valores/styles.xml', modificar el tema para su aplicación/actividad y añadir el siguiente estilo:

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

por último, en su Vista de Texto personalizado, puede ahora utilizar el constructor con el atributo y recibirá su estilo. Aquí, en lugar de estar 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 se puede hacer una sentencia if/else para generar nuevos puntos de vista 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 señalar que repetidamente usó customTextView en diferentes variantes y lugares diferentes, pero de ninguna manera se requiere que el nombre de la vista coincida con el estilo o el atributo ni nada. Además, esta técnica debería funcionar con cualquier vista personalizada, no solo con TextViews.

+0

Para mí el uso de '' no funcionó, tuve que eliminar el '@ attr' para que funcione, por lo que es simplemente' ' – virhonestum

0

poner este código

super.setStyle(R.style.yourownstyle) 

antes setContentView() en onCreate

Cuestiones relacionadas