假设您有以下字符串:
String s = "The cold hand reaches for the %1$s %2$s Ellesse's"; String old = "old"; String tan = "tan"; String formatted = String.format(s,old,tan); //"The cold hand reaches for the old tan Ellesse's"
假设您希望以此字符串结束,但也Span
为任何替换的单词设置了特定的集合String.format
.
例如,我们还想做以下事情:
Spannable spannable = new SpannableString(formatted); spannable.setSpan(new StrikethroughSpan(), oldStart, oldStart+old.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.setSpan(new ForegroundColorSpan(Color.BLUE), tanStart, tanStart+tan.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
是否有结识的开始指数的稳健的方式old
和tan
?
请注意,只搜索'old'会在'cold'中返回'old',因此无效.
什么会的工作,我想,正在寻找%[0-9]$s
事前,并计算补偿值以反映在更换String.format
.这看起来很令人头疼,我怀疑可能有一种方法String.format
可以提供有关其格式化细节的更多信息.好吧,有吗?
我创建了一个String.format
与spannables一起使用的版本.下载并使用它就像普通版本一样.在您的情况下,您将跨越格式说明符(可能使用strings.xml).在输出中,它们将围绕这些说明符被替换的任何内容.
使用像这样的Spannables很头疼 - 这可能是最简单的方法:
String s = "The cold hand reaches for the %1$s %2$s Ellesse's"; String old = "<font color=\"blue\">old</font>"; String tan = "<strike>tan</strike>"; String formatted = String.format(s,old,tan); //The cold hand reaches for the <font color="blue">old</font> <strike>tan</strike> Ellesse's Spannable spannable = Html.fromHtml(formatted);
问题:这没有放入StrikethroughSpan
.为了做到这一点StrikethroughSpan
,我们TagHandler
从这个问题中借用了一个习惯.
Spannable spannable = Html.fromHtml(text,null,new MyHtmlTagHandler());
MyTagHandler:
public class MyHtmlTagHandler implements Html.TagHandler { public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if (tag.equalsIgnoreCase("strike") || tag.equals("s")) { processStrike(opening, output); } } private void processStrike(boolean opening, Editable output) { int len = output.length(); if (opening) { output.setSpan(new StrikethroughSpan(), len, len, Spannable.SPAN_MARK_MARK); } else { Object obj = getLast(output, StrikethroughSpan.class); int where = output.getSpanStart(obj); output.removeSpan(obj); if (where != len) { output.setSpan(new StrikethroughSpan(), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } private Object getLast(Editable text, Class kind) { Object[] objs = text.getSpans(0, text.length(), kind); if (objs.length == 0) { return null; } else { for (int i = objs.length; i > 0; i--) { if (text.getSpanFlags(objs[i - 1]) == Spannable.SPAN_MARK_MARK) { return objs[i - 1]; } } return null; } } }