获取 TextView 中特定单词的行 | ANDROID
Get line of a specific word in TextView | ANDROID
我有以下问题:
我有一个 TextView,并且有一个来自 StringBuilder 的文本,其中标记了一个词,这个词被定义为 StringArray。
现在的问题是我不知道如何获取这个特定单词的行。
我知道有这种方法可以转到特定行:
scrollView.post(new Runnable() {
@Override
public void run() {
int y = textView.getLayout().getLineTop(0); //That's the line where the view goes to
scrollView.scrollTo(0, y);
}
});
现在我希望视图不转到特定的行,而是视图应该转到随单词可变的特定行。
是否有像 "getLineTop" 这样的命令,所以这不是一行而是一个词?
谢谢
编辑
int total = 0;
String word_search = Etxt.getText().toString().trim().toLowerCase();
String fullTxt = textView.getText().toString();
String[] array = fullTxt.split("\n");
final String[] markiert = new String[array.length];
String word;
StringBuilder st = new StringBuilder();
for (int i = 0; i < array.length; i++) {
word = array[i];
if (word.toLowerCase().contains(word_search)) {
markiert[i] = word.trim();
st.append("<b><i><font color=\"#035525\">" + markiert[i] + "</font></i></b>");
total++;
} else {
st.append(word);
}
st.append("<br>");
}
textView.setText(Html.fromHtml("" + st));
scrollView.post(new Runnable() {
@Override
public void run() {
int indexOfWord = textView.getText().toString().indexOf(markiert[0]);
int line = textView.getLayout().getLineForOffset(indexOfWord);
int y = textView.getLayout().getLineTop(line);
scrollView.scrollTo(0, y);
}
});
这就是代码
Get the line number on which the specified text offset appears.
所以现在您只需要标记单词的起始索引。
您可能已经有了这个,或者您可以进行简单的 indexOf 查找。
或者,您可以使用 Spannable 来标记(和设置样式)单词。
像这样使用:
String wordToLookFor = "Hello";
int indexOfWord = textView.getText().toString().indexOf(wordToLookFor);
int lineNumber = textView.getLayout().getLineForOffset(index);
编辑
试试
String textToFind = Etxt.getText().toString().trim().toLowerCase();
String fullTxt = textView.getText().toString();
SpannableString spannable = new SpannableString(fullTxt);
final int index = fullTxt.indexOf(textToFind);
if(index == -1) {
// text does not contain the word
Toast.makeText(getApplicationContext(), "Text '" + textToFind + "' not found.", Toast.LENGTH_SHORT).show();
}
else {
int lineNum = textView.getLayout().getLineForOffset(index);
int lineStart = textView.getLayout().getLineEnd(lineNum -1);
int lineEnd = textView.getLayout().getLineEnd(lineNum);
// set style to the entire line, as your origional code
spannable.setSpan(new ForegroundColorSpan(Color.parseColor("#035525")), lineStart, lineEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), lineStart, lineEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannable);
textView.post(new Runnable() {
@Override
public void run() {
int line = textView.getLayout().getLineForOffset(index);
int y = textView.getLayout().getLineTop(line);
scrollView.scrollTo(0, y);
}
});
}
我有以下问题: 我有一个 TextView,并且有一个来自 StringBuilder 的文本,其中标记了一个词,这个词被定义为 StringArray。
现在的问题是我不知道如何获取这个特定单词的行。
我知道有这种方法可以转到特定行:
scrollView.post(new Runnable() {
@Override
public void run() {
int y = textView.getLayout().getLineTop(0); //That's the line where the view goes to
scrollView.scrollTo(0, y);
}
});
现在我希望视图不转到特定的行,而是视图应该转到随单词可变的特定行。
是否有像 "getLineTop" 这样的命令,所以这不是一行而是一个词?
谢谢
编辑
int total = 0;
String word_search = Etxt.getText().toString().trim().toLowerCase();
String fullTxt = textView.getText().toString();
String[] array = fullTxt.split("\n");
final String[] markiert = new String[array.length];
String word;
StringBuilder st = new StringBuilder();
for (int i = 0; i < array.length; i++) {
word = array[i];
if (word.toLowerCase().contains(word_search)) {
markiert[i] = word.trim();
st.append("<b><i><font color=\"#035525\">" + markiert[i] + "</font></i></b>");
total++;
} else {
st.append(word);
}
st.append("<br>");
}
textView.setText(Html.fromHtml("" + st));
scrollView.post(new Runnable() {
@Override
public void run() {
int indexOfWord = textView.getText().toString().indexOf(markiert[0]);
int line = textView.getLayout().getLineForOffset(indexOfWord);
int y = textView.getLayout().getLineTop(line);
scrollView.scrollTo(0, y);
}
});
这就是代码
Get the line number on which the specified text offset appears.
所以现在您只需要标记单词的起始索引。
您可能已经有了这个,或者您可以进行简单的 indexOf 查找。
或者,您可以使用 Spannable 来标记(和设置样式)单词。
像这样使用:
String wordToLookFor = "Hello";
int indexOfWord = textView.getText().toString().indexOf(wordToLookFor);
int lineNumber = textView.getLayout().getLineForOffset(index);
编辑
试试
String textToFind = Etxt.getText().toString().trim().toLowerCase();
String fullTxt = textView.getText().toString();
SpannableString spannable = new SpannableString(fullTxt);
final int index = fullTxt.indexOf(textToFind);
if(index == -1) {
// text does not contain the word
Toast.makeText(getApplicationContext(), "Text '" + textToFind + "' not found.", Toast.LENGTH_SHORT).show();
}
else {
int lineNum = textView.getLayout().getLineForOffset(index);
int lineStart = textView.getLayout().getLineEnd(lineNum -1);
int lineEnd = textView.getLayout().getLineEnd(lineNum);
// set style to the entire line, as your origional code
spannable.setSpan(new ForegroundColorSpan(Color.parseColor("#035525")), lineStart, lineEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), lineStart, lineEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannable);
textView.post(new Runnable() {
@Override
public void run() {
int line = textView.getLayout().getLineForOffset(index);
int y = textView.getLayout().getLineTop(line);
scrollView.scrollTo(0, y);
}
});
}