Android。仅当 ScrollView 可滚动时滚动条才可见

Android. Have scrollbar only visible if ScrollView is scrollable

有没有简单的方法让 ScrollView 中的滚动条仅在视图可滚动时可见?

我知道可以通过比较 ScrollView 和里面的 ViewGroup 的高度然后调用 ScrollView.setScrollbarFadingEnabled(false); 来实现 但它的开销很大,我觉得应该有一种更简单、更干净的方法。

使用 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) {
           ScrollView.setVerticalScrollBarEnabled(false);
        }
    } 
});

在我看来,这是一个干净的解决方案,没有比这更简单的方法了。

您描述的是 ScrollView 的正常行为。如果 ScrollView 不可滚动,则 ScrollBar 不会出现。如果视图不可滚动,即使 android:fadeScrollbars="false" 也不会生效。 也许 ScrollView 本身的唯一 child 太大以适应视口(或 ScrollView 容器)在你的情况下,ScrollView 似乎总是有一个滚动条。您可以通过将简单的 TextView 作为 child 放入 ScrollView 并调整高度来测试它。