检查ScrollView是否高于屏幕/可滚动

18

我如何检查一个ScrollView是否高于屏幕?当ScrollView的内容适合屏幕时,它是不可滚动的;当其内容超出屏幕高度时,它可以滚动。如何检查ScrollView在这方面的条件?


当内容适合屏幕时,滚动视图已经无法滚动。 - string.Empty
这是默认行为。 - Shivang Trivedi
2
我知道这是正常和逻辑行为,但我想知道是否有一种方法可以检查ScrollView是否适合屏幕或超出了屏幕。 - fweigl
4个回答

27

以下是来自ScrollView的代码,该类为私有,但可以进行修改以在类本身外部使用。

/**
 * @return Returns true this ScrollView can be scrolled
 */
private boolean canScroll() {
    View child = getChildAt(0);
    if (child != null) {
        int childHeight = child.getHeight();
        return getHeight() < childHeight + mPaddingTop + mPaddingBottom;
    }
    return false;
}

11

太晚了,但是我正在使用以下代码,它看起来更安全:

if (view.canScrollVertically(1) || view.canScrollVertically(-1)) {
    // you code here
}

5

ScrollView始终只有一个子组件。你所需做的就是获取子组件的高度。

 int scrollViewHeight = scrollView.getChildAt(0).getHeight();

计算屏幕高度

如果两者相等(或scrollView的高度更大),则适合您的屏幕。


4
如果您的滚动视图覆盖整个屏幕,那么就是这样。 - string.Empty
@NicolasTyler 只需要整个屏幕的高度。如果滚动视图不在整个屏幕的高度上,那么您就会知道您的滚动视图的大小是多少。一切都可以计算,给出一些数学公式。 - T_V
虽然现在有点晚了,但为什么不试试这样:bool childLargerThanParent = scrollView.getChildAt(0).getHeight() > scrollView.getHeight();?更安全,计算量也少。 - auhmaan

5
在我的情况下,我正在检查scrollView(其中包含文本)在活动创建时是否可以垂直滚动。在手机上,它可以滚动,但是在平板电脑上不能。canScrollVertically返回了一个不正确的值,因为还无法确定。我通过在OnGlobalLayoutListener中调用它来解决了这个问题。
(Kotlin)
override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    // Must use onGlobalLayout or else canScrollVertically will not return the correct value because the layout hasn't been made yet
    scrollView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {

        override fun onGlobalLayout() {
            // If the scrollView can scroll, disable the accept menu item button
            if ( scrollView.canScrollVertically(1) || scrollView.canScrollVertically(-1) )
                acceptMenuItem?.isEnabled = false

            // Remove itself after onGlobalLayout is first called or else it would be called about a million times per second
            scrollView.viewTreeObserver.removeOnGlobalLayoutListener(this)
        }
    })
}

我的使用场景是显示使用条款。我不希望用户在滚动到底部之前启用接受按钮。虽然有些晚了,但我希望这可以解决一些关于canScrollVertically的困惑。


这是完美的解决方案。太棒了,你救了我的一天。 - Joker
在我的测试中,即使内容是可滚动的,canScrollVertically(...)onGlobalLayout() 中返回 false。这意味着该按钮从一开始就启用,无论用户是否滚动到底部。 - user2891462

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