如何以编程方式将 ScrollView 滚动到底部

Posted

技术标签:

【中文标题】如何以编程方式将 ScrollView 滚动到底部【英文标题】:How to Programmatically Scroll a ScrollView to Bottom 【发布时间】:2011-12-22 08:28:24 【问题描述】:

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

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

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

你知道我怎样才能得到 ScrollView 的实际底部吗 添加一些元素后?

【问题讨论】:

其实ScrollView可以改变也可以不改变它的高度(它是一个LinearLayout的容器)。尝试使用 ScrollView 的第一个(也是单个)子 LinearLayout 的 getBottom()。 两个容器(ScrollView 和 LinearLayout)看起来都有相同的问题:底部位置不反映最后添加的项目:-/ 发布代码,您将在其中添加新元素。没有你的代码很难说。我想,可能是权重问题之类的。 【参考方案1】:

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

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

这对我有用。

【讨论】:

这也适用于 NestedScrollView,我试过了。谢谢 也为我工作。 推荐全滚动,scrollTo() 方法不会滚动到全顶。【参考方案2】:

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

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

即替换:

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

与:

Footer.requestFocus();

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

android:focusable="true"
android:focusableInTouchMode="true"

【讨论】:

这个可聚焦的属性非常适合在这种情况下使用......当有复杂的布局时......谢谢 我发现很难在屏幕底部看到视图。我有一个包含 TextViews 的 ListView。我尝试 listView.getItemAtPosition(elementCount -1) 来获取该文本视图,但它返回的是字符串而不是视图。我怀疑在这种情况下我需要制作一个自定义 arrayAdapter。 当底部有一个按钮时,按钮会出现波纹效果,这让它变得很奇怪! 不错!非常感谢! 如果你在做showCaseView,它可以完美运行【参考方案3】:

这样就好了

scrollView.post(new Runnable() 
    @Override

    public void run() 

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

    
);

【讨论】:

【参考方案4】:

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

【讨论】:

scroll.fullScroll(View.FOCUS_DOWN) 是我尝试的第一件事,但它不起作用。【参考方案5】:

你也可以应用这个

 mScrollviewHomepage.setScrollY(View.FOCUS_DOWN);

【讨论】:

【参考方案6】:

因为,我也使用隐藏键盘,所以下面的延迟为 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);

【讨论】:

这是从另一个答案复制过来的 我已经添加了注释。注意:我刚刚用上面示例中的 postDelayed() 替换了 post() 我的问题是,我也在使用隐藏键盘。因此 post() 没有帮助我。 “200 毫秒”延迟对我来说很神奇。【参考方案7】:

我希望它有效

试试这个:

nsscroll.post(new Runnable() @Override

                    public void run() 

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

                    
                );

【讨论】:

以上是关于如何以编程方式将 ScrollView 滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将非活动选项卡滚动到底部

UIScrollView 以编程方式滚动到底部

以编程方式滚动到顶部不起作用?

Android 平滑滚动到底部

是否可以让 ScrollView 滚动到底部?

Appcelerator Webview滚动到底部?