I am looking to create a custom ViewGroup
to be used in a library; which contains a few ImageButton
objects. I would like to be able to apply a style each ImageButton
; but I cannot figure out how to apply a style programmatically other than by applying a attribute resource to the defStyleAttr
parameter; like so:
mImageButton = new ImageButton(
getContext(), // context
null, // attrs
R.attr.customImageButtonStyle); // defStyleAttr
The issue with this is that the only way to change the style of each ImageButton
would be by applying a style to this attribute in a parent theme. But I would like to be able to set a default style, without having to manually set this attribute for each project that uses this library.
There is a parameter that does exactly what I am looking for; defStyleRes
, which can be used like so:
mImageButton = new ImageButton(
getContext(), // context
null, // attrs
R.attr.customImageButtonStyle, // defStyleAttr
R.style.customImageButtonStyle); // defStyleRes
This parameter is only available at API Level 21 and above, but my projects target API Level 16 and above. So how can I set the defStyleRes
, or apply a default style, without access to this parameter?
I applied my style using a ContextThemeWrapper
, as suggested by @EugenPechanec, which seems to work well, but each ImageButton
now has the default ImageButton
background, even though my style applies <item name="android:background">@null</item>
.
Here is the style I am using:
<style name="Widget.Custom.Icon" parent="android:Widget">
<item name="android:background">@null</item>
<item name="android:minWidth">56dp</item>
<item name="android:minHeight">48dp</item>
<item name="android:tint">@color/selector_light</item>
</style>
And this is how I am applying it:
ContextThemeWrapper wrapper = new ContextThemeWrapper(getContext(), R.style.Widget_Custom_Icon);
mImageButton = new AppCompatImageButton(wrapper);
On the left is what I am getting, and on the right is what I would like it to look like:
ContextThemeWrapper
seems like the correct way to go. I have come across it before, but it completely escaped my mind. Unfortunately it is causing another issue; for some reason it is adding a background resource on eachImageButton
. I can remove the background after the fact by settingmImageButton.setBackgroundResource(0)
but I cannot do this in my style resource with<item name="android:background">@null</item>
, even though I can change other attributes. Any idea of what could be causing this? – Bosson