java - 如何获取由 getString() 格式化的子字符串的位置?

标签 java android

如何获取读取的子字符串的位置 getString(int resId, Object...formatArgs)

例如我有这些资源

<string name="fruit">pear</string>
<string name="sentence">I like a <xliff:g id="fruit" example="apple">%s</xliff:g>.</string>

并通过

读入它们
String fruit = getString(R.string.fruit); // = "pear"
String sentence = getString(R.string.sentence, fruit); // = "I like a pear."

我想知道“pear”这个词从哪里开始,例如在它下划线。当提到的水果出现在句子末尾时我就可以去吃

int pos = sentence.length() - fruit.length() - 1;

但是一旦发生变化(例如使用不同的语言),就会中断。我可以在 sentence 中搜索 fruit,但例如,一旦同一个水果被提及两次,这可能会中断。

关于如何可靠做到这一点有什么想法吗?遗憾的是,改变资源和数据解析的实现并不是一个选择。

最佳答案

我的建议是更改字符串资源以使用 <annotation>标签而不是 <xliff:g>标签:

<string name="sentence">I like a <annotation id="fruit" example="apple">%s</annotation>.</string>

如果您能做到这一点,那么您可以将字符串资源检索为 SpannedString使用getResources().getText()然后检查跨度:

SpannedString spanned = (SpannedString) getResources().getText(R.string.sentence);
Annotation[] spans = spanned.getSpans(0, spanned.length(), Annotation.class);
int startPosition = spanned.getSpanStart(spans[0]);

然后您可以将其格式化以供显示:

String fruit = getString(R.string.fruit);
String sentence = String.format(spanned.toString(), fruit);

如果您根本无法更改资源,则可以使用 getString() 执行类似的操作无需额外参数即可检索字符串及其格式参数 ( %s ),然后使用 indexOf()对此:

String text = getResources().getString(R.string.sentence);
int startPosition = text.indexOf("%s");

然后以相同的方式格式化它以进行显示:

String fruit = getString(R.string.fruit);
String sentence = String.format(text, fruit);

由于多种原因,这更糟糕(理论上该字符串可能包含 "%s" 作为非格式参数子字符串,您需要提前知道格式参数的确切规范,等等)。但如果您无法改变其他任何事情,这可能是您能做的最好的事情。

关于java - 如何获取由 getString() 格式化的子字符串的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53233945/

相关文章:

java - 通过 Java 进行 IP Hook

java - Java中可以通过反射创建可变数量且变量名递增的变量吗?

android - 将系统应用程序替换为您自己在android上修改的应用程序

java - 从枚举调用函数

c# - 如何从考勤机获取数据

java - JUnit5 - @CsvSource - 将源代码转换为 POJO

android - 如何在 FragmentPagerAdapter 的某些覆盖方法中设置 fragment Id?

android - 这是以编程方式调用 fragment 的正确方法吗?

Java-如何顺序查找数组中可能未填充的元素的最后一次出现?

.net - 如何将 json 字符串从 java 发送到 .NET REST 服务?