如何在文本中插入drawables

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

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

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

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

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

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

  • 让Android Activity看起来像对话框
  • 如何检测布局resize?
  • Android:如何更改ProgressBar的高度?
  • 在Android上移植的iOS UI元素
  • 为什么R不存在错误进入android?
  • Android TextView文本背景颜色
  • 是否可以制作水平NumberPicker?
  • 多状态切换按钮
  • 您可以创建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中使用资产中的图像 。