将文本视图的特定行滚动到顶部不适用于最后一个全屏

Scrolling a specific line of textview to top not working for last screen-full

我打算让下面的代码滚动 textview 以便与 找到的令牌成为顶行。我的代码基于这个 SO 问题 ... Scrolling a TextView to a specific line

除了显示最后一个全屏时,即手动时,它都有效 用户滚动也不会滚动文本。我希望这个 行为与 getLineForOffsetgetLineTop 尤其是 scrollTo 如何协同工作有关,但我对这一点的理解还不足以确定如何处理。关于滚动到特定行的同一主题还有其他一些 SO 问题,但我没有看到这个特定问题得到解决。

iFind 初始化为 0 用于第一个查找。

case R.id.findnext:
    tokenString = token.getText().toString();
    iFind = containsIgnoreCase(tokenString, html.getText().toString(), ++iFind);
    if (iFind == -1) toast("Not Found: " + tokenString);
    else {
        final Layout lay = html.getLayout();
        final int lineNumb = lay.getLineForOffset(iFind);
        mScrollView.post(new Runnable() {
            @Override
            public void run() {
                int y = lay.getLineTop(lineNumb);
                mScrollView.scrollTo(0, y);
            }
        });
    }
    public int containsIgnoreCase(String needle, String hayStack, int start) {
       final int lengthNeedle = needle.length();
       final char firstLo = Character.toLowerCase(needle.charAt(0));
       final char firstUp = Character.toUpperCase(needle.charAt(0));

       int i;
       for (i = start;  i < hayStack.length() - lengthNeedle; i++) {
           final char ch = hayStack.charAt(i);
           if (ch != firstLo && ch != firstUp)
               continue;
           if (hayStack.regionMatches(true, i, needle, 0, lengthNeedle))
               return i;
       }
       return -1;
   }

  <ScrollView
    android:id="@+id/scrollView"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical" >

<TextView
    android:id="@+id/codeHTML"
    android:visibility="visible"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/background_material_light"
    android:scrollbars="vertical"
    android:fadeScrollbars="false"
    android:typeface="monospace"
    android:textColor="#000000"
    android:textSize="15sp"
    android:textIsSelectable="true" />

</ScrollView>

重读我的post,尤其是“当用户手动滚动时文本也不会滚动”这句话后,我意识到scrollTo 很简单不会这样做。相反,我使用 Spannable 来突出显示找到的标记,这样该行就不必位于 TextView 的顶部。这对于现在将立即看到包含令牌及其上下文的行的用户来说要好得多。