This question is asked in a lot of places in a lot of different ways. I originally answered it here but I feel it's relevant in this thread as well (since i ended up here when I was searching for an answer).
There is no one line solution to this problem, but this worked for my use case. The problem is, the 'View(context, attrs, defStyle)' constructor does not refer to an actual style, it wants an attribute. So, we will:
Define an attribute
Create a style that you want to use
Apply a style for that attribute on our theme
Create new instances of our view with that attribute
In 'res/values/attrs.xml', define a new attribute:
...
In res/values/styles.xml' I'm going to create the style I want to use on my custom TextView
18sp
@color/white
14dp
In 'res/values/themes.xml' or 'res/values/styles.xml', modify the theme for your application / activity and add the following style:
@style/CustomTextView
...
Finally, in your custom TextView, you can now use the constructor with the attribute and it will receive your style
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context, null, R.attr.customTextView);
}
}
It's worth noting that I repeatedly used customTextView in different variants and different places, but it is in no way required that the name of the view match the style or the attribute or anything. Also, this technique should work with any custom view, not just TextViews.