如何以编程方式将 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 滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章