Android:ScrollView强制底部

我想要一个ScrollView从底部开始。 任何方法?

scroll.fullScroll(View.FOCUS_DOWN)也应该工作。

你应该像这样在scroll.post里面运行代码:

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

最适合我的是

 scroll_view.post(new Runnable() { @Override public void run() { // This method works but animates the scrolling // which looks weird on first load // scroll_view.fullScroll(View.FOCUS_DOWN); // This method works even better because there are no animations. scroll_view.scrollTo(0, scroll_view.getBottom()); } }); 

我增加了完美的工作。

  private void sendScroll(){ final Handler handler = new Handler(); new Thread(new Runnable() { @Override public void run() { try {Thread.sleep(100);} catch (InterruptedException e) {} handler.post(new Runnable() { @Override public void run() { scrollView.fullScroll(View.FOCUS_DOWN); } }); } }).start(); } 

注意

这个答案是真正的老版本的android的解决方法。 今天postDelayed没有更多的错误,你应该使用它。

scroll.fullScroll(View.FOCUS_DOWN)将导致焦点的变化。 当有多个可聚焦视图时,这会带来一些奇怪的行为,例如两个EditText。 这个问题还有另一种方法。

  View lastChild = scrollLayout.getChildAt(scrollLayout.getChildCount() - 1); int bottom = lastChild.getBottom() + scrollLayout.getPaddingBottom(); int sy = scrollLayout.getScrollY(); int sh = scrollLayout.getHeight(); int delta = bottom - (sy + sh); scrollLayout.smoothScrollBy(0, delta); 

这很好。

有时scrollView.post不起作用

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

所以如果你使用scrollView.postDelayed,它肯定会工作

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

当视图尚未加载时,您将无法滚动。 你可以在上面用post或sleep调用“稍后”,但是这不是很优雅。

最好是规划滚动,并在下一个onLayout()。 示例代码在这里:

https://stackoverflow.com/a/10209457/1310343

有一件事要考虑的是不要设置。 确保您的子控件,特别是EditText控件,没有设置RequestFocus属性。 这可能是布局中最后一个解释的属性之一,它将覆盖其父项(布局或滚动视图)上的重力设置。

不完全是问题的答案,但是我需要在EditText获得焦点时向下滚动。 然而,接受的答案会使ET也失去焦点(我认为滚动视图)。

我的解决方法如下:

 emailEt.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus){ Toast.makeText(getActivity(), "got the focus", Toast.LENGTH_LONG).show(); scrollView.postDelayed(new Runnable() { @Override public void run() { scrollView.fullScroll(ScrollView.FOCUS_DOWN); } }, 200); }else { Toast.makeText(getActivity(), "lost the focus", Toast.LENGTH_LONG).show(); } } });