如何检查ScrollView是否可以滚动

15

我想知道如何检查当前的ScrollView是否可以滚动?似乎在ScrollView中并没有名为canScrollisScrollable的公共方法。

可滚动:您可以将ScrollView内的ViewGroup上下移动,当您移动它时,滚动条将可见。因此,如果ScrollView中只有少量行,并且它们可以适合单个屏幕,则ScrollView是不可滚动的。


可滚动 - 您可以在ScrollView中上下移动ViewGroup,并且当您向上或向下移动时,滚动条将可见。 - Cheok Yan Cheng
这就是ScrollView的作用,我不明白你的问题。 - njzk2
3个回答

21

你可以进行一些简单的计算来计算视图的原始高度和内容高度。如果这些高度的差值小于0,则视图是可滚动的。

要计算原始高度,您可以使用View.getMeasuredHeight()。 因为ScrollView是一个ViewGroup并且只有一个子项,所以请使用ViewGroup.getChildAt(0).getHeight()获取该子项的高度;

使用ViewTreeObserver来获取高度,因为它将在布局/视图更改可见性的时候被调用,否则高度可能为0。

ScrollView scrollView = (ScrollView)findViewById(R.id...);
ViewTreeObserver observer = scrollView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        int viewHeight = scrollView.getMeasuredHeight();
        int contentHeight = scrollView.getChildAt(0).getHeight();
        if(viewHeight - contentHeight < 0) {
            // scrollable
        }
    }
});

使用scrollView.getChildAt(0).getHeight()而不是scrollView.getChildAt(0).getMeasuredHeight()有什么原因吗? - Cheok Yan Cheng
@CheokYanCheng 在这种情况下,这些方法之间没有区别。根据我的测试,这些值是相等的。但是,如果您在Java代码中更改布局参数,请使用getHeight()确保返回正确的值。 - Steve Benett

5
scrollView.viewTreeObserver
        .addOnGlobalLayoutListener {

            val isScrollable = scrollView.canScrollVertically(1)
        }

0

我觉得我可能漏掉了什么,但是它不应该只是检查一下吗?

scrollView.getHeight() >= parentView.getMeasuredHeight()

你可能实际需要的是:scrollView.getChildAt(0).getHeight() 和/或 parentView.getHeight(),但是思路是相同的。


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