54

我有一个无法解决的问题:在 ScrollView 中我只有一个 LinearLayout。通过用户操作,我以编程方式在此 LinearLayout 上添加 2 个 TextView,但默认情况下,滚动保持在顶部。由于我控制用户操作,我应该很容易滚动到底部,如下所示:

ScrollView scroll = (ScrollView) this.findViewById(R.id.scroll);
scroll.scrollTo(0, scroll.getBottom());

但实际上不是。因为在添加这两个新元素后立即 getBottom() 仍然返回前两个。我试图刷新状态调用refreshDrawableState(),但我不工作。

您知道添加一些元素后如何获得 ScrollView 的实际底部吗?

4

7 回答 7

135

您需要使用消息队列,否则它将不起作用。试试这个:

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

这对我有用。

于 2012-04-18T20:31:10.823 回答
81

这实际上并不能回答你的问题。但这是一个几乎做同样事情的替代方案。

不要滚动到屏幕底部,而是将焦点更改为位于屏幕底部的视图。

也就是说,替换:

scroll.scrollTo(0, scroll.getBottom());

和:

Footer.requestFocus();

确保您指定视图,例如“页脚”是可聚焦的。

android:focusable="true"
android:focusableInTouchMode="true"
于 2012-05-05T05:18:20.853 回答
19

这会好的

scrollView.post(new Runnable() {
    @Override

    public void run() {

        scroll.scrollTo(0, scroll.getBottom());

    }
});
于 2012-06-25T09:55:49.077 回答
5

你试过scroll.fullScroll(View.FOCUS_DOWN)吗?

于 2011-11-04T21:50:43.613 回答
0

你也可以应用这个

 mScrollviewHomepage.setScrollY(View.FOCUS_DOWN);
于 2018-05-29T09:35:00.667 回答
0

因为,我也在使用隐藏键盘,下面的代码延迟 200 毫秒对我来说效果更好。注意:我只是将上面示例中的 post() 替换为 postDelayed() :

    final ScrollView scrollView_main = (ScrollView) findViewById(R.id.scrollView_main);
    scrollView_main.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView_main.fullScroll(View.FOCUS_DOWN);
        }
    }, 200);
于 2021-01-06T14:03:54.077 回答
0

我希望它有效

试试这个:

nsscroll.post(new Runnable() { @Override

                    public void run() {

                        nsscroll.scrollTo(0, nsscroll.getBottom());

                    }
                });
于 2022-02-08T13:28:26.833 回答