2011-09-21 11 views
6

No he encontrado una manera de hacerlo programáticamente así que estoy publicando esta pregunta aquí (tampoco encontré ninguna pregunta relacionada con esta).Aplicación de recurso de estilo programáticamente

Tengo un estilo de recurso, definido en res/values ​​/ styles.xml. Lo que trato de hacer es aplicar este estilo dentro de mi actividad usando java a un objeto View que estoy manipulando.

¿Es posible lograr esto en Android o el estilo solo se puede aplicar a un objeto usando el atributo android: style?

Respuesta

3

No, no es posible aplicar genéricamente recursos de estilo a una instancia de Vista existente. Los recursos de estilo solo se pueden aplicar a las Vistas durante el tiempo de construcción.

Para comprender por qué, estudie el constructor View(Context context, AttributeSet attrs, int defStyle). Este es el único lugar donde se leen los atributos de vista central (como android: fondo), por lo que no hay forma de aplicar un estilo una vez que se ha construido la vista. El mismo patrón se usa para las subclases de Vista, como TextView. Tendrá que aplicar los atributos de estilo manualmente usando setters.

Tenga en cuenta que si crea una instancia de forma progamática de la vista, puede usar cualquier recurso de estilo a través del parámetro de constructor defStyle.

+0

No estoy instanciando programáticamente la Vista. Es una vista personalizada que creé extendiendo LinearLayout ... así que me gustaría dejar que el usuario use style = "@ style/...", me gustaría aplicar el estilo de manera programática, pero usando el recurso de estilo y no aplicar programáticamente atributo por atributo de este estilo existente. – Thiago

+0

"Tenga en cuenta que si crea una instancia de forma progamática de la vista, puede usar cualquier recurso de estilo a través del parámetro constructor defStyle". ¿Has hecho esto? Tenía problemas y al buscar encontré esto. http://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=12683 – sadaf

2

Al menos por un TextView esto es posible usando el método setTextAppearance(context, resid). El resId del estilo se puede encontrar en R.style..

+0

bueno, en realidad necesito aplicar el estilo para toda la vista ... por ejemplo, LinearLayout o RelativeLayout. – Thiago

+0

No puede cambiar la vista después de que se haya creado, sin embargo, puede proporcionar un estilo personalizado al constructor de la clase View. [link] (http://groups.google.com/group/android-developers/browse_thread/thread/88c53b8c790a750d) – crnv

5

Compartí esta respuesta here, pero como esto tiene su propio hilo conversacional, creo que también es relevante aquí.

No hay una sola 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/estilos.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

public class CustomTextView extends TextView { 

    public CustomTextView(Context context) { 
     super(context, null, R.attr.customTextView); 
    } 
} 

Vale la pena señalar que repetidamente utilicé customTextView en diferentes variantes y lugares diferentes, pero de ninguna manera es necesario 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.

Cuestiones relacionadas