有没有一种方式可以检索TextView的可见行数或范围?

24

我有一个全屏的TextView,里面包含着一长串需要滚动查看的Spanned文本。TextView的getLineCount()方法可以获得整个文本块所用的总行数,但我想知道当前屏幕上可见的文本行数。

更好的方法是,有没有办法找出当前屏幕上可见的文本行范围?例如,在视图滚动时,是否可以确定当前可见的是第20到60行的文本?

2个回答

37

我找到了答案:

int height    = myTextView.getHeight();
int scrollY   = myTextView.getScrollY();
Layout layout = myTextView.getLayout();

int firstVisibleLineNumber = layout.getLineForVertical(scrollY);
int lastVisibleLineNumber  = layout.getLineForVertical(scrollY+height);

1
如果您想在视图布局之前检索它,则会返回null。 - Yaroslav Mytkalyk
2
我尝试使用上述代码,但在横向方向使用时返回错误的行数。此外,有几行部分可见。 - user2538359
让我得到getLayout()返回null。 - vijay
getScrollY 对我总是返回0。 - Sver
1
对我来说不起作用,返回最后一行的索引(我通过计数进行了检查),可能是因为填充或其他原因。 - Nimitz14

6
为了使它们正常工作,您应该按@Robert发布的代码以这种方式编写:
ViewTreeObserver vto = txtViewEx.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                ViewTreeObserver obs = txtViewEx.getViewTreeObserver();
                obs.removeOnGlobalLayoutListener(this);
                height = txtViewEx.getHeight();
                scrollY = txtViewEx.getScrollY();
                Layout layout = txtViewEx.getLayout();

                firstVisibleLineNumber = layout.getLineForVertical(scrollY);
                lastVisibleLineNumber = layout.getLineForVertical(height+scrollY);

            }
        });

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