如何在文本中插入drawables

我想将小图片(例如箭头图标)插入TextView某些内容位置。

下面的照片描绘了我想要的东西:

这就是我想在文本中嵌入图标的方式

显然,最天真的解决方案是在小型ImageView对象的两侧使用多个TextView 。 但这种方法不具备可扩展性。

我很想知道是否有人用一些简单而聪明的技巧克服了这个问题。 (也许在HTML或外部库的帮助下)

非常感谢任何有效的解决方案。

您可以创建SpannableString并将任何对象添加到字符串中

 TextView textView = (TextView) findViewById(R.id.textView); ImageSpan imageSpan = new ImageSpan(this, R.drawable.ic_launcher); SpannableString spannableString = new SpannableString(textView.getText()); int start = 3; int end = 4; int flag = 0; spannableString.setSpan(imageSpan, start, end, flag); textView.setText(spannableString); 

有一段时间有一个类似的问题 ,有人提出了一个很棒的解决方案。 我只是稍微调整了一下,以便图像大小始终与线条一样高。 所以基本上你的图标将使用textSize进行缩放

第1步 – 创建一个新视图

创建一个扩展TextView的新Java类

 public class TextViewWithImages extends TextView { public TextViewWithImages(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public TextViewWithImages(Context context, AttributeSet attrs) { super(context, attrs); } public TextViewWithImages(Context context) { super(context); } @Override public void setText(CharSequence text, BufferType type) { Spannable s = getTextWithImages(getContext(), text, this.getLineHeight()); super.setText(s, BufferType.SPANNABLE); } private static final Spannable.Factory spannableFactory = Spannable.Factory.getInstance(); private static boolean addImages(Context context, Spannable spannable, float height) { Pattern refImg = Pattern.compile("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E"); boolean hasChanges = false; Matcher matcher = refImg.matcher(spannable); while (matcher.find()) { boolean set = true; for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) { if (spannable.getSpanStart(span) >= matcher.start() && spannable.getSpanEnd(span) < = matcher.end() ) { spannable.removeSpan(span); } else { set = false; break; } } String resName = spannable.subSequence(matcher.start(1), matcher.end(1)).toString().trim(); int id = context.getResources().getIdentifier(resName, "drawable", context.getPackageName()); Drawable mDrawable = context.getResources().getDrawable(id); mDrawable.setBounds(0, 0, (int)height, (int)height); if (set) { hasChanges = true; spannable.setSpan( new ImageSpan(mDrawable), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); } } return hasChanges; } private static Spannable getTextWithImages(Context context, CharSequence text, float height) { Spannable spannable = spannableFactory.newSpannable(text); addImages(context, spannable, height); return spannable; } } 

第2步 - 布局中的用法

现在在layout-xml中只使用TextViewWithImages类

  

第3步 - 使用图标创建字符串

正如您在TextViewWithImages类的addImages(...)函数中看到的, addImages(...)的特殊模式( [img src=my_icon/] )用于添加图像。 所以这是一个例子:

 The [img src=ic_action_trash/] is used to delete an item while the [img src=ic_action_edit/] is to edit one. 

输出:

在此处输入图像描述

如前所述,它将与您的textSize扩展:

在此处输入图像描述

正如最初所说,这篇文章的大部分内容取自18446744073709551615的答案。 我认为这应该作为一个库出版,因为在文本中有图像是一个常见的用例。 <

一个选项是使用WebView而不是TextView 。 这也允许您显示资产文件夹中的图像。

有关更多详细信息,请参阅Android开发:在WebView的HTML中使用资产中的图像 。