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()。 示例代码在这里:
有一件事要考虑的是不要设置。 确保您的子控件,特别是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(); } } });