24

似乎为了在 Android 中将 ImageSpan 添加到 Spannable,我实际上必须用 Image 替换一些文本。例如:

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);

这将用图像替换“imageplace”。因为我正在处理复杂的多跨度文本和重复,所以在我想要android图标的每个地方插入无意义的文本有点让人头疼。但是看起来如果跨度的开始和结束相同,则不会包含图像。有没有办法解决?

4

3 回答 3

21

也许您可以添加一个额外的空间来替换 ImageSpan。例如,

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);

你会发现图像替换了额外的空间而不破坏文本。

于 2015-04-20T04:21:41.403 回答
13

您必须知道文本的长度,即要添加图像之后的长度。例如..

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);
于 2017-03-31T17:14:49.390 回答
0

如果要在文本末尾插入 Drawable,Drawable 将隐藏文本的最后一个字符,以避免在文本末尾添加另一个字符并在该字符处开始绘制。

val myText = "Your text"    

val span: Spannable = SpannableString(myText+"-")
val android: Drawable = ContextCompat.getDrawable(this, R.drawable.yourDrawable)!!
android.setBounds(0, 0, 30, 30)
val image = ImageSpan(android, ImageSpan.ALIGN_BOTTOM)
span.setSpan(image, span.indexOf("-"), span.indexOf("-")+1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE)
于 2021-05-03T21:39:22.250 回答