在TextView中以编程方式滚动单词到视图中

5

我有一个包含大量文本的TextView,用户搜索某些内容后,我会高亮匹配项,但这些匹配项可能在页面底部,有没有一种方法可以滚动到第一个匹配项处?

我已经在Google上搜索过很多,似乎没有找到相关的内容。

我的布局:

<ScrollView android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:requiresFadingEdge="vertical"
            android:id="@+id/sclView">

    <TextView android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:id="@+id/txtView"
              android:textSize="16sp"
              android:paddingTop="10dp"
              android:paddingLeft="20dp"
              android:paddingRight="20dp"
              android:paddingBottom="10dp"
              android:lineSpacingExtra="5dp"
              android:textColor="@color/TextGray"
              android:textIsSelectable="true"/>
</ScrollView>
1个回答

6
我假设没有水平滚动条。如果有,您可以根据此答案进行推断。由于您正在突出显示匹配项,我还要假设您已经掌握了查找部分。这意味着您应该至少有一个在CharSequence中搜索字符串的起始位置。
使用Layout.getLineForOffset来查找字符串所在的行,然后使用Layout.getLineTop获取该行顶部的位置,最后使用View.scrollTo来滚动到想要的位置。代码应该如下所示:
Layout layout = textView.getLayout();
scrollView.scrollTo(0, layout.getLineTop(layout.getLineForOffset(startPos)));

我没有尝试过这个方法,因此你可能需要对添加的填充等内容进行一些处理,但是我认为总体思路应该有效。


这对我有效!但是由于ScrollView中有许多其他视图,因此我必须执行类似于scrollView.scrollTo(0, layout.getLineTop(txtView.getTop() + layout.getLineForOffset(startPos))); 这样的操作。因此,txtView.getTop()获取textView相对于其父视图的顶部位置(以像素为单位),并将其添加到您要查找的行的getLineTop垂直位置。 - nommer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接