如何在活动启动时滚动到ScrollView的底部


96

我正在ScrollView中显示一些数据。在活动启动时(方法onCreate),我将数据填充到ScrollView中,并希望滚动到底部。

我尝试使用getScrollView().fullScroll(ScrollView.FOCUS_DOWN)。当我将其作为单击按钮时的动作时,此方法有效,但在onCreate方法中不起作用。

有什么方法可以在活动启动时将ScrollView滚动到底部吗?这意味着第一次显示时视图已经滚动到底部。


这也解释了为什么在初始化自己的ScrollView子类时尝试使用getMeasuredWidth时总是得到0。
Ghoti 2012年

Answers:


218

它需要完成以下工作:

    getScrollView().post(new Runnable() {

        @Override
        public void run() {
            getScrollView().fullScroll(ScrollView.FOCUS_DOWN);
        }
    });

这样,视图首先被更新,然后滚动到“新”底部。


1
我正在尝试这个,但它似乎仍然无法正常工作...您onCreate在包含中调用上述代码Activity吗?
pstanton

我做它在onStart
帕洛阿尔托

4
相反,post()使用具有100ms延迟的postDelayed()。它可以从任何活动的生命周期角度进行工作。
Vitaliy 2015年

50

在添加数据之后,输入以下代码:

final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
    @Override
    public void run() {
        scrollview.fullScroll(ScrollView.FOCUS_DOWN);
    }
});

4
对我来说,这仅适用于postDelayed而不是post。仅100毫秒的延迟。
Andreas Rudolph

完善。当然可以使用带有scrollview.fullScroll(ScrollView.FOCUS_UP)的组合;
ieselisra 2015年

30

这对我有用:

scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollview.post(new Runnable() {
            public void run() {
                scrollview.fullScroll(View.FOCUS_DOWN);
            }
        });
    }
});

2
到目前为止,此问题的最佳答案。许多其他方法是有条件的,但是这种方法太棒了n作品非常好:)
rana

17

您可以在布局文件中执行此操作:

                android:id="@+id/listViewContent"
                android:layout_width="wrap_content"
                android:layout_height="381dp" 
                android:stackFromBottom="true"
                android:transcriptMode="alwaysScroll">

8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);

4

试试这个

    final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
    scrollview.post(new Runnable() {
       @Override
       public void run() {
         scrollview.fullScroll(ScrollView.FOCUS_DOWN);
       }
    });

3

在将数据追加到视图之后,立即添加以下单行:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

1

初始化UI组件并填充数据后。将这些行添加到您的on create方法中

Runnable runnable=new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    };
    scrollView.post(runnable);

1

这是最好的方法。

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.