Android:如何将 Spannable.setSpan 与 String.format 结合起来?
我将 Span
设置为文本的一部分。 Span 本身效果很好。但是,文本是由 Resources
中的 String.format
创建的,我不知道部分的 start
和 end
在文本中我将设置 Span 为。
我尝试在 strings.xml
中使用自定义 HTML 标记,但 getText
或 getString
删除了它们。我可以使用类似这样的 getString(R.string.text, "
,然后使用 Html.fromHtml(),因为
arg
正是我想要设置 Span 的位置。
我看到 这种方法使用格式为“普通文本##span此处##普通文本”
的文本。它解析字符串,删除标签并设置 Span。
有没有更好的方法将 Span 设置为格式化字符串,例如 "something %s some"
或者我应该使用上述方法之一?
I'm setting Span
to part of the text. Span itself works well. However, the text is created by String.format
from Resources
and I do not know start
and end
of part in the text I'm going to set Span to.
I tryed to use custom HTML tags in strings.xml
, but either getText
or getString
remove them. I could use something like this getString(R.string.text, "<nb>" + arg + "</nb>")
, then Html.fromHtml()
, because the arg
is exactly where i want to set the Span.
I seen this approach that used text formatted "normal text ##span here## normal text"
. It parses the string removes tags and sets Span.
Is there a better way to set Span into a formatted string like "something %s something"
or should I use one of the above approaches?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
getText()
将返回包含 strings.xml 中定义的格式的SpannedString
对象。我创建了 自定义String.format
的版本,它将保留格式字符串中的任何范围,即使它们包含格式说明符(SpannedString
参数中的范围)也被保留)。像这样使用它:getText()
will returnSpannedString
objects that contain the formatting defined in strings.xml. I have created a custom version ofString.format
that will preserve any spans in the format string, even of they enclose format specifiers (spans inSpannedString
arguments are also preserved). Use it like this:我决定编写一个由 George 提供的 此处 的 Kotlin 版本,以防有一天链接消失:
I've decided to write a Kotlin version of what was offered here by George, in case the link goes away some day:
我通过引入
TaggedArg
类解决了这个问题,该类的实例扩展为value
。然后我创建了负责读取包含标签的文本并用跨度替换这些标签的对象。不同的跨度在地图标签->工厂中注册。有一个小惊喜。如果您有类似
"something Something"
的文本,Html.fromHtml
会将该文本读取为"something Something< /xx>”
。我必须在整个文本周围添加标签来防止这种情况发生。
I solved this by introducing
TaggedArg
class, instances of this class expands to<tag>value</tag>
. Then I created object that is responsible for reading text containing tags and replacing these tags by spans. Different spans are registered in map tag->factory.There was one little surprise. If you have text like
"<xx>something</xx> something"
,Html.fromHtml
reads this text as"<xx>something something</xx>"
. I had to add tags<html>
around whole text to prevent this.乔治认为的 getText() 方式很有趣。但不需要额外编写一个类。
getText()
返回一个CharSequence
。因此,使用SpannableStringBuilder
将其设置为 TextView:在 strings.xml 中,您可以使用 html 标签编写它(不要忘记文本前后的引号):
这种标记对我有用手动将其设置为 textView (如上)或将其分配到布局中。
The way by
getText()
that George supposed is interesting. But there is no need of writing an extra class.getText()
returns aCharSequence
. So useSpannableStringBuilder
to set this to a TextView:In your strings.xml you can write it with html-tags (do not forget the quotations before and after the text):
This kind of tagging worked for me either setting it manually to a textView (like above) or assigning it in a layout.