将“相同”样式设置为文本的几个部分

时间:2017-12-26 15:22:34

标签: android

我有样式(例如,BackgroundColorSpan),我想将它设置为文本的多个部分。但是如果将BackgroundColorSpan等的相同实例分配给文本的其他部分,则样式会移动。

如,

  Object HighlightStyle = new BackgroundColorSpan(Color.argb(255, 255, 215, 0));
  TextView X = (TextView) findViewById(R.id.Text);
  SpannableStringBuilder SpannableBuilder = new SpannableStringBuilder();
  SpannableBuilder.append("1");
  SpannableBuilder.setSpan(HighlightStyle, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // This is hilited
  SpannableBuilder.append("2");
  SpannableBuilder.setSpan(HighlightStyle, 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // This is hilited and 1 is no more hilited
  SpannableBuilder.append("3");
  SpannableBuilder.append("4");
  SpannableBuilder.setSpan(HighlightStyle, 3, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // This is hilited and 1 and 2 are no more hilited
  X.setText(SpannableBuilder);
  // I want hilited 1,2,4 all at the same time

为什么我这样做?用户可以搜索某些文字,并突出显示该文字。

我想怎么做?所有文字都在一个TextView中。我有一个SpannableStringBuilder。我有一个方法将文本分成几部分 - String和Boolean。 String是part,Boolean表示文本是否匹配 - 应该是否为highligted。我只是将例如BackgroundColorSpan的实例传递给该方法,它应该应用于匹配的每个部分,但由于setSpan的行为,只突出显示最后一部分。

潜在解决方案:Style未实现.clone方法。我可以做一个解决方法,如序列化/反序列化它来创建新的实例,但这看起来真的像一个黑客。

是否有一些优雅的方法如何将相同的样式设置为文本的X部分?

1 个答案:

答案 0 :(得分:1)

每次拨打/data/db/mongod.lock时都应创建新的HighlightStyle对象,您可以使用下一种方法执行此操作:

setSpan()

通过所有更改,您的代码将成为下一个:

CharacterStyle.wrap()


这就是它在我的应用程序中的外观:

enter image description here