Esta pregunta se hace en muchos lugares de muchas maneras diferentes. Originalmente lo respondí aquí, pero siento que también es relevante en este hilo (ya que terminé aquí cuando estaba buscando una respuesta).
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 'View (context, attrs, defStyle)' no se refiere a un estilo real, quiere un atributo. Entonces, nosotros:
- Definir un atributo
- Crea un estilo que quieras usar
- Aplicar un estilo para ese atributo en nuestro tema
- Cree 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
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context, null, R.attr.customTextView);
}
}
Vale la pena señalar que usé repetidamente customTextView en diferentes variantes y diferentes lugares, 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 TextViews.