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

时间:2018-11-09 22:14:29

标签: 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."

我想知道“梨”一词从何而来,例如为强调它。当提到的水果在句子的结尾时,我可以去

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

,但这种更改会立即中断(例如,使用其他语言)。我可以在fruit中搜索sentence,但是例如一旦提到两次相同的水果,这可能会中断。

关于如何做到这一点的任何想法可靠?可悲的是,更改资源的实现和数据解析不是一个选择。

3 个答案:

答案 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);