假设我使用SpannableStringBuilder将多个东西附加到其中,其中一个是我从strings.xml文件格式化的字符串,其中包含一个span:
SpannableStringBuilder stringBuilder = new SpannableStringBuilder ();
stringBuilder.append(...)...
final SpannableString span = new SpannableString(...);
span.setSpan(new BackgroundColorSpan(0xff990000), ...,...,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
stringBuilder.append(getString(R.string.string_to_format, span));
stringBuilder.append(...)...
textView.setText(stringBuilder);
遗憾的是,格式化这样的字符串会删除跨度本身,因此在我的情况下,不会有任何带背景颜色的文本。
这发生在“getString”的行上。
如果我只是单独追加跨度(没有“getString”),它就可以正常工作。
我还尝试调查Html.fromHtml,但它似乎不支持文本的背景颜色。
是否可以格式化具有跨度但仍具有跨度的字符串?
更具体地说,输入是strings.xml文件中的字符串A,它只有一个占位符(没有特殊的HTML标记),另一个字符串B应该在运行时替换占位符。字符串B应该有一个突出显示自身的部分文本。
在我的情况下,突出显示的文本是在字符串B中搜索的内容。
答案 0 :(得分:2)
好的,我已经找到了我特殊情况的答案,但我仍然想知道是否有更好的方法。
这就是我的所作所为:
String stringToSearchAt=...
String query=...
int queryIdx = stringToSearchAt.toLowerCase().indexOf(query);
stringToSearchAt= stringToSearchAt.substring(0, queryIdx + query.length()) + "<bc/>" + stringToSearchAt.substring(queryIdx + query.length());
final String formattedStr=getString(..., stringToSearchAt);
stringBuilder.append(Html.fromHtml(formattedStr, null, new TagHandler() {
int start;
@Override
public void handleTag(final boolean opening, final String tag, Editable output, final XMLReader xmlReader) {
switch (tag) {
case "bc":
if (!opening)
start = output.length() - query.length();
break;
case "html":
if (!opening)
output.setSpan(new BackgroundColorSpan(0xff00bbaa), start, start + query.length(), 0);
}
}
}));
这只适用于我的情况,但在一般格式化的情况下,这还不够。
答案 1 :(得分:1)
格式化跨区字符串可能是不可能的,因为它仍然使用String.format()格式化String finilly,它是Java API,而Span是Android API。
但我认为你可以使用html字符串代替。请查看此文档Styling with HTML markup。
例如:
String str = "Hi <strong><font color=\"#00bbaa\">%s</font></strong>, Welcome to <em><font color=\"#FF4081\">%s</font></em>";
String text = String.format(str, "Lucy", "Android");
Spanned spanned = Html.fromHtml(text);
// after Html.fromHtml(), you can still change the Span
SpannableString spannableString = new SpannableString(spanned);
spannableString.setSpan(new BackgroundColorSpan(0xff990000), 0, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
结果
如果您想将字符串放在string.xml中,您可能需要更改&#39;&lt;&#39;到&#39;&#;;&#39;%s&#39;到&#39;%1 $ s&#39;。
<string name="from_offical">Hello <strong><font color="#00bbaa">%1$s</font></strong>, Welcome to <em><font color="#00bbaa">%2$s</font></em></string>