Android:如何将Spannable.setSpan和String.format结合起来?

我将Span设置为文本的一部分。 跨度本身运作良好。 然而,文本是由ResourcesString.format创build的,我不知道文本中的部分的startend ,我将设置跨度为。

我尝试在strings.xml使用自定义HTML标记,但getTextgetString删除它们。 我可以使用像这样的getString(R.string.text, "<nb>" + arg + "</nb>") ,然后Html.fromHtml() ,因为arg正是我想要设置Span的地方。

我看到这种使用文本格式"normal text ##span here## normal text" 。 它parsingstring,删除标签并设置Span。

我的问题是,是否有更好的方法来完成将span设置为如"something %s something"格式化string还是应该使用上述方法之一?

Solutions Collecting From Web of "Android:如何将Spannable.setSpan和String.format结合起来?"

我通过引入TaggedArg类来解决这个问题,这个类的实例展开为<tag>value</tag> 。 然后我创build了一个对象,它负责读取包含标签的文本,并通过跨度replace这些标签。 不同的跨度在地图标签 – >工厂中注册。

有一个小惊喜。 如果您的文本是"<xx>something</xx> something" ,则Html.fromHtml会将此文字读作"<xx>something something</xx>" 。 为了防止这种情况,我必须在整个文本中添加标签<html>

getText()将返回包含strings.xml中定义的格式的SpannedString对象。 我已经创build了一个String.format的自定义版本 ,它将保留格式化string中的任何跨度,甚至包含格式说明符( SpannedString参数中的跨度也被保留)。 像这样使用它:

 Spanned toDisplay = SpanFormatter.format(getText(R.string.foo), bar, baz, quux); 

乔治认为有趣的getText()方法。 但是没有必要写一个额外的课程。 getText()返回一个CharSequence 。 所以使用SpannableStringBuilder将其设置为TextView:

 textViewCell.setText(new SpannableStringBuilder(getText(R.string.foo)); 

在您的strings.xml中,您可以使用html-tags(不要忘记文本之前和之后的引号):

 <string name="foo">"CO<sub><small>2</small></sub>"</string> 

这种标记工作,我要么手动设置为textView(如上)或分配在一个布局。