在TextView中获取特定单词的行ANDROID

时间:2017-03-08 14:16:06

标签: android scrollview getline scrollto

我有以下问题: 我有一个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);
        }
    });

代码

1 个答案:

答案 0 :(得分:3)

查看方法getLineForOffset(int)

  

获取显示指定文本偏移的行号。

所以你现在所需要的只是标记词的起始索引 您可能已经有了这个,或者您可以进行简单的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);
            }
        });
    }