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:
- Definir un atributo
- crear un estilo que desea utilizar
- Aplicar un estilo para ese atributo en nuestro tema
- 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.
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
"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