I have this function that works fine on Android 4.4.1, but breaks on 5.0+.
public static SpannableStringBuilder prependImage(Drawable drawable, String text) {
SpannableStringBuilder builder = new SpannableStringBuilder(" " + text);
builder.setSpan(new ImageSpan(drawable), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return builder;
}
And I use it like this:
class MyButton extends Button {
// ... snip ...
setText(
prependImage(
getDrawable(imageResource, color),
getContext().getString(stringResource)),
BufferType.SPANNABLE);
Here is the getDrawable()
method referenced above:
private Drawable getDrawable(int resource, int color) {
final Resources resources = getContext().getResources();
Drawable drawable = resources.getDrawable(resource);
if (drawable != null) {
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
}
return drawable;
}
When I debug, everything seems to succeed, but no image is drawn. Any ideas what I might be doing wrong?
Your code related to working with Spannables is ok. You can check it by setting text for TextView.
The problem is in material design of button on Android 5.0.
<style name="Widget.Material.Button">
<item name="background">@drawable/btn_default_material</item>
<item name="textAppearance">?attr/textAppearanceButton</item>
<item name="minHeight">48dip</item>
<item name="minWidth">88dip</item>
<item name="stateListAnimator">@anim/button_state_list_anim_material</item>
<item name="focusable">true</item>
<item name="clickable">true</item>
<item name="gravity">center_vertical|center_horizontal</item>
</style>
There are two solution.
The first one is just use TextView as your button and setText with image to it.
For another (and may be more correct) you need to extend button style (Widget.Material.Button
) in next way:
<style name="BtnStyle" parent="android:Widget.Material.Button">
<item name="android:textAppearance">@null</item>
</style>
Then in your layout:
<Button
android:id="@+id/test2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Test"
style="@style/BtnStyle"/>
After you'll do it you should see the images in the button.
Don't forget for Android version that is lower than 5.0 you should create BtnStyle
too, but in other resource directory (res/values-v14/style.xml).