gpt4 book ai didi

android - 如何让 SpannableStringBuilder 附加一个位于格式化字符串内的跨度?

转载 作者:行者123 更新时间:2023-11-29 17:17:29 24 4
gpt4 key购买 nike

背景

假设我使用 SpannableStringBuilder 将多个内容附加到其中,其中之一是我从 strings.xml 文件格式化的字符串,其中有一个跨度:

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 中搜索的内容。

最佳答案

好的,我已经找到了我的特殊最终案例的答案,但我仍然想知道是否有更好的方法。

这是我做的:

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);
}
}
}));

这仅适用于我的情况,但对于一般格式,这还不够。

关于android - 如何让 SpannableStringBuilder 附加一个位于格式化字符串内的跨度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38193309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com