Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any way to insert an ImageSpan in a TextView without disrupting the text?

It seems that in order to add an ImageSpan to a Spannable in Android, I have to actually replace some text with the Image. For example:

Spannable span = new SpannableString("Foo imageplace Bar!");
Drawable android = context.getResources().getDrawable(R.drawable.android);
android.setBounds(0, 0, 32,32);
ImageSpan image = new ImageSpan(android, ImageSpan.ALIGN_BASELINE);
span.setSpan(image, 4, 14, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

This will replace "imageplace" with the image. Because I'm dealing with complex multi-span text and reiteration, it's a bit of a headache to insert meaningless text at each place I want the android icon. But it looks like if start and end of span are the same, the image won't be included. Is there any way around this?

like image 887
yuttadhammo Avatar asked Nov 11 '14 07:11

yuttadhammo


2 Answers

Maybe you can add an additional space to be replaced by the ImageSpan. For example,

Spannable span = new SpannableString("Foo  imageplace Bar!");
Drawable android = context.getResources().getDrawable(R.drawable.android);
android.setBounds(0, 0, 32,32);
ImageSpan image = new ImageSpan(android, ImageSpan.ALIGN_BASELINE);
span.setSpan(image, 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

And you will find the image replace the additional space without disrupting the text.

like image 82
lovefish Avatar answered Oct 16 '22 23:10

lovefish


You have to know the length of the text, the one after you want to add the image. For example..

Drawable image = ContextCompat.getDrawable(mContext, android.R.drawable.presence_offline);
image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight());
// Replace blank spaces with image icon
String myText = "myText";
int textLength = myText.length();
SpannableString sb = new SpannableString(myText + "   " + "This is another text");
ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM);
sb.setSpan(imageSpan, textLength, textLength + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
like image 26
dianakarenms Avatar answered Oct 16 '22 22:10

dianakarenms