Убедитесь, что ScrollView выше, чем экран/прокручиваемый

Как проверить, что ScrollView выше экрана? Когда содержимое ScrollView подходит к экрану, ScrollView не прокручивается, когда содержимое превышает высоту экрана, прокручиваемое. Как я могу проверить условие ScrollView в этом отношении?

Ответ 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 Height больше), то он подходит на вашем экране.

Ответ 4

В моем случае я проверял, был ли мой scrollView (который содержал текст) прокручиваться по вертикали при создании действия. На телефонах это прокручивается, а на планшетах - нет. 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