【问题标题】:Wrappable TextView with SpannableStringBuilder and ImageSpan hides the last image on every line带有 SpannableStringBuilder 和 ImageSpan 的 Wrappable TextView 隐藏每一行的最后一个图像
【发布时间】:2015-10-22 21:42:56
【问题描述】:

我正在用元素动态填充多行 TextView。输入元素的行是可换行的。每个元素由两部分组成:文本和图像。图像长度为 2 个字符。元素由空格分隔。为了添加元素,我使用 SpannableStringBuilder。除了一件事,一切都很好。在添加一个进入下一行的新元素(TextView 换行)时,上一行的最后一个元素的图像会消失,无论该行上还有多少可用空间。如果我删除新行上新添加的元素,该图像会再次出现。因此,每行最后一个元素的图像部分不会显示出来。我使用的是 Android 4.0.3。

这是我的代码:

TextView textView = (TextView) findViewById(R.id.textview);
textView.setMovementMethod(new ScrollingMovementMethod());

SpannableStringBuilder ssb = new SpannableStringBuilder();

//then for each new element I do the following
ssb.append(" "); //space separating elements (skip for the first element)
ssb.append("text");
Bitmap image = BitmapFactory.decodeResource( getResources(), imageId );
ssb.append("  "); //prepare 2-character space for the image
ssb.setSpan( new ImageSpan(image), ssb.length() - 2, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); //put the image to the prepared space
textView.setText( ssb, BufferType.SPANNABLE );

我知道 TextWatcher 有一个解决方案。同时,我在我的代码中看不到任何流程,也无法理解为什么每一行的最后一个图像都被隐藏了。任何建议将不胜感激。谢谢。

【问题讨论】:

  • 那么你能解决这个问题吗?我有同样的问题。请分享您的解决方案。
  • 我很想听听这个问题的解决方案,我也遇到了同样的问题。
  • @4aRkKn1gh7 查看my answer below

标签: java android textview


【解决方案1】:

我找到了解决方案。问题在于计算文本行的方式。如果一行以空格字符结尾,则在计算过程中将省略该空格。因此,您所要做的就是使用任何字母作为图像的占位符。像这样:

ssb.append(" i"); //prepare 2-characters for the image

PS:我不知道你为什么要为每张图片使用 2 个字符串,但我不得不说你只能使用一个 Char。这是更高效的代码:

int start = ssb.length();
ssb.append('i');
ssb.setSpan(new ImageSpan(image), start, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

【讨论】:

  • 解决了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
相关资源
最近更新 更多