【问题标题】:Check if ScrollView is higher than screen / scrollable检查 ScrollView 是否高于屏幕/可滚动
【发布时间】:2013-09-02 12:00:30
【问题描述】:

如何检查ScrollView 是否高于屏幕?当ScrollView 的内容适合屏幕时,ScrollView 不可滚动,当其内容超过屏幕高度时,它是可滚动的。 在这方面我如何检查ScrollView 的情况?

【问题讨论】:

  • 当内容适合屏幕时,滚动视图已经无法滚动
  • 这是默认行为
  • 我知道这是正常且合乎逻辑的行为,我想知道是否有一种方法可以检查 ScrollView 是否适合屏幕或超出屏幕。

标签: android android-layout


【解决方案1】:

这是来自 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;
}

【讨论】:

    【解决方案2】:

    为时已晚,但我正在使用以下代码,它看起来对我来说更安全:

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

    【讨论】:

      【解决方案3】:

      一个 ScrollView 总是有 1 个孩子。你需要做的就是得到孩子的身高

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

      并计算屏幕高度

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

      【讨论】:

      • 如果你的滚动视图覆盖了整个屏幕。
      • @NicolasTyler 仅屏幕的整个高度。如果滚动视图不在屏幕的整个高度上,那么您将知道滚动视图的大小。一切都可以计算,给一些数学。
      • 虽然迟到了,但为什么不这样:bool childLargerThanParent = scrollView.getChildAt(0).getHeight() &gt; scrollView.getHeight();?更安全,更少计算
      【解决方案4】:

      在我的例子中,我正在检查我的 scrollView(包含文本)是否可以垂直滚动在创建 Activity 时。在手机上,它会滚动,但在平板电脑上却不能。 canScrollVertically 正在返回我不正确的值,因为它还无法确定。我通过在OnGlobalLayoutListener 中调用它解决了这个问题。

      (科特林)

      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 的困惑

      【讨论】:

      • 这是完美的解决方案。真棒,你拯救了我的一天。
      • 在我的测试中,canScrollVertically(...)onGlobalLayout() 内返回false,即使内容是可滚动的。这意味着无论用户是否滚动到底部,按钮都会从一开始就启用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2019-10-05
      • 2019-03-17
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多