获取单词的开始和结束位置
Get the word start and end position
所以我试图突出显示基于单词的文本视图,但我的代码无法正常工作我想做的是“Hello world”,这两个单词都有不同的颜色,但对我来说只有 hello 部分正在获取突出显示
SpannableString spannableString = new SpannableString(all_folder.get(position).getAudioChineseText());
String spannableword = all_folder.get(position).getAudioChineseText();
String[] splitStr = spannableword.split("\s+");
int end = 0;
for (int i = 0; i < splitStr.length; i++) {
end = splitStr[i].length() + i;
int start=splitStr[i].length()+1;
textcolor(holder.textChines, spannableString, i, end, all_folder.get(position).getSpeechResponse());
}
textcolour 方法工作正常,但位置没有正确传递不知道我做错了什么,因为我需要传递单词的开始和结束位置
如果您想要原始字符串中的位置,请不要使用 split()
,而是使用 find()
循环。
String spannableword = "Hello World";
Matcher m = Pattern.compile("\S+").matcher(spannableword);
while (m.find()) {
String str = m.group();
int start = m.start();
int end = m.end();
System.out.printf("Found word (%d - %d): '%s'%n", start, end, str);
}
输出
Found word (0 - 5): 'Hello'
Found word (6 - 11): 'World'
注意使用的正则表达式是 \S+
,与拆分正则表达式相反 \s+
。
您可以使用 String#lastIndexOf
和 String#indexOf
来获取跨区索引。下面是一个例子。
private SpannableString getSpanString(String text){
SpannableString spannableString = new SpannableString(text);
int startIndex1= 0;
int endIndex1= text.indexOf(" ");
int startIndex2= text.lastIndexOf(" ");
int endIndex2 = text.length();
spannableString.setSpan(new ForegroundColorSpan(Color.RED), startIndex1, endIndex1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new ForegroundColorSpan(Color.BLUE), startIndex2, endIndex2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}
当然你需要先处理这里的边缘情况。就像 String 只有一个词或它的空白但想法保持不变。在方法的开头添加边缘情况后试一试。此外,您还必须 trim 使用前的字符串。
所以我试图突出显示基于单词的文本视图,但我的代码无法正常工作我想做的是“Hello world”,这两个单词都有不同的颜色,但对我来说只有 hello 部分正在获取突出显示
SpannableString spannableString = new SpannableString(all_folder.get(position).getAudioChineseText());
String spannableword = all_folder.get(position).getAudioChineseText();
String[] splitStr = spannableword.split("\s+");
int end = 0;
for (int i = 0; i < splitStr.length; i++) {
end = splitStr[i].length() + i;
int start=splitStr[i].length()+1;
textcolor(holder.textChines, spannableString, i, end, all_folder.get(position).getSpeechResponse());
}
textcolour 方法工作正常,但位置没有正确传递不知道我做错了什么,因为我需要传递单词的开始和结束位置
如果您想要原始字符串中的位置,请不要使用 split()
,而是使用 find()
循环。
String spannableword = "Hello World";
Matcher m = Pattern.compile("\S+").matcher(spannableword);
while (m.find()) {
String str = m.group();
int start = m.start();
int end = m.end();
System.out.printf("Found word (%d - %d): '%s'%n", start, end, str);
}
输出
Found word (0 - 5): 'Hello'
Found word (6 - 11): 'World'
注意使用的正则表达式是 \S+
,与拆分正则表达式相反 \s+
。
您可以使用 String#lastIndexOf
和 String#indexOf
来获取跨区索引。下面是一个例子。
private SpannableString getSpanString(String text){
SpannableString spannableString = new SpannableString(text);
int startIndex1= 0;
int endIndex1= text.indexOf(" ");
int startIndex2= text.lastIndexOf(" ");
int endIndex2 = text.length();
spannableString.setSpan(new ForegroundColorSpan(Color.RED), startIndex1, endIndex1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new ForegroundColorSpan(Color.BLUE), startIndex2, endIndex2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}
当然你需要先处理这里的边缘情况。就像 String 只有一个词或它的空白但想法保持不变。在方法的开头添加边缘情况后试一试。此外,您还必须 trim 使用前的字符串。