如何获取读取的子字符串的位置
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/