如何获取由读取的子字符串的位置
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."
我想知道“梨”一词从何而来,例如为强调它。当提到的水果在句子的结尾时,我可以去
int pos = sentence.length() - fruit.length() - 1;
,但这种更改会立即中断(例如,使用其他语言)。我可以在fruit
中搜索sentence
,但是例如一旦提到两次相同的水果,这可能会中断。
关于如何做到这一点的任何想法可靠?可悲的是,更改资源的实现和数据解析不是一个选择。
答案 0 :(得分:2)
我的建议是更改您的字符串资源,以使用<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
)的字符串,然后使用{{1 }}:
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);
作为非格式参数子字符串,您需要提前知道格式参数的确切说明,等等)。但是,如果您别无选择,那可能是您能做的最好的事情。
答案 1 :(得分:0)
您可以像这样拆分字符串:
String[] parts = sentence.split(" " + fruit + " ");
String part1 = parts[0];
int pos = part1.length() + 1;
part1是一个字符串,其中包含“ pear”之前的所有内容,因此其长度是单词“ pear”以负1开头的位置(我们需要在单词前后使用“”,以确保不会找到它)句子中无关单词的一部分)。
答案 2 :(得分:0)
使用indexOf方法
int pos = sentence.indexOf(fruit);