获取 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);
        }
    });

这就是代码

看方法getLineForOffset(int):

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);
            }
        });
    }