我可以在Android中以编程方式滚动ScrollView吗?
有什么办法滚动ScrollView
编程方式到某个位置?
我创build了一个放置在ScrollView
dynamicTableLayout
。 所以我想要一个特定的行动(如点击一个button等),特定的行应自动滚动到顶部的位置。
可能吗?
ScrollView sv = (ScrollView)findViewById(R.id.scrl); sv.scrollTo(0, sv.getBottom());
要么
sv.scrollTo(5, 10);
从Pragna的答案不总是工作,试试这个:
mScrollView.post(new Runnable() { public void run() { mScrollView.scrollTo(0, mScrollView.getBottom()); } });
要么
mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(mScrollView.FOCUS_DOWN); } });
我希望scrollView在onCreateView()之后直接滚动(不是在点击button之后)。 为了使其工作,我需要使用ViewTreeObserver:
mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } }); } });
但是要注意,每当有东西被打断时,就会调用这个方法(例如,如果你设置了一个不可见的视图或类似的视图),所以如果你不需要它,就不要忘记删除这个监听器:
public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
在SDK Lvl <16上
要么
SDK中的public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
Lvl> = 16
使用这样的东西:
mScrollView.scrollBy(10, 10);
要么
mScrollView.scrollTo(10, 10);
这里有很多很好的答案,但我只想补充一点。 有时会发生,你想滚动你的ScrollView到布局的特定视图,而不是完全滚动到顶部或底部。
一个简单的例子:在registry单中,如果用户在表单的编辑文本未填写时点击“注册”button,则需要滚动到特定的编辑文本,告诉用户必须填写该字段。
在这种情况下,你可以这样做:
scrollView.post(new Runnable() { public void run() { scrollView.scrollTo(0, editText.getBottom()); } });
或者,如果你想要一个平滑的滚动,而不是一个即时滚动:
scrollView.post(new Runnable() { public void run() { scrollView.smoothScrollTo(0, editText.getBottom()); } });
显然你可以使用任何types的视图,而不是编辑文本。 请注意,getBottom()根据其父级布局返回视图的坐标,所以在ScrollView中使用的所有视图都应该只有一个父级(例如线性布局)。
如果你在ScrollView的子元素中有多个父元素,唯一的解决方法就是在父视图中调用requestChildFocus:
editText.getParent().requestChildFocus(editText, editText);
但在这种情况下,你不能有一个光滑的滚动。
我希望这个答案可以帮助有同样问题的人。
尝试使用scrollTo
方法更多信息
如果你想立即滚动,那么你可以使用:
ScrollView scroll= (ScrollView)findViewById(R.id.scroll); scroll.scrollTo(0, scroll.getBottom()); OR scroll.fullScroll(View.FOCUS_DOWN); OR scroll.post(new Runnable() { @Override public void run() { scroll.fullScroll(View.FOCUS_DOWN); } });
或者,如果你想平滑滚动,所以你可以使用这个:
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(); }
我得到这个工作滚动到一个ScrollView的底部(与一个TextView里面):
(我把这个更新TextView的方法)
final ScrollView myScrollView = (ScrollView) findViewById(R.id.myScroller); myScrollView.post(new Runnable() { public void run() { myScrollView.fullScroll(View.FOCUS_DOWN); } });
注意:如果你已经在一个线程中,你必须创build一个新的post线程,或者它不滚动新的长高度,直到完成(对我来说)。 例如:
void LogMe(final String s){ runOnUiThread(new Runnable() { public void run() { connectionLog.setText(connectionLog.getText() + "\n" + s); final ScrollView sv = (ScrollView)connectLayout.findViewById(R.id.scrollView); sv.post(new Runnable() { public void run() { sv.fullScroll(sv.FOCUS_DOWN); /* sv.scrollTo(0,sv.getBottom()); sv.scrollBy(0,sv.getHeight());*/ } }); } }); }
添加另一个不涉及坐标的答案。
这将带来您想要的视图集中(但不是最高的位置):
yourView.getParent().requestChildFocus(yourView,yourView);
public void RequestChildFocus(View child,View focused)
孩子 – 这个ViewParent想要关注的孩子。 这个视图将包含重点视图。 这不一定是真正关注的观点。
集中 – 是实际上有焦点的孩子的后裔的观点
**滚动到所需的高度。 我已经想出了一些很好的解决scheme**
scrollView.postDelayed(new Runnable() { @Override public void run() { scrollView.scrollBy(0, childView.getHeight()); } }, 100);
我用sv.fullScroll(View.FOCUS_DOWN)使用Runnable; 它适用于眼前的问题,但该方法使得ScrollView从整个屏幕上取得焦点,如果每次都使AutoScroll发生,没有EditText将能够从用户接收信息,我的解决scheme是使用不同的代码在可运行的情况下:
sv.scrollTo(0,sv.getBottom()+ sv.getScrollY());
同样不会把重点放在重要的观点上
问候。
每个人都发布这样复杂的答案。
我发现一个简单的答案,滚动到底部,很好:
final ScrollView myScroller = (ScrollView) findViewById(R.id.myScrollerView); // Scroll views can only have 1 child, so get the first child's bottom, // which should be the full size of the whole content inside the ScrollView myScroller.smoothScrollTo( 0, myScroller.getChildAt( 0 ).getBottom() );
而且,如果有必要,您可以将上面的第二行代码放入可运行的代码中:
myScroller.post( new Runnable() { @Override public void run() { myScroller.smoothScrollTo( 0, myScroller.getChildAt( 0 ).getBottom() ); } }
我花了很多研究和玩耍来find这个简单的解决scheme。 我希望它也能帮助你! 🙂
只是页面滚动:
ScrollView sv = (ScrollView) findViewById(your_scroll_view); sv.pageScroll(View.FOCUS_DOWN);
是的你可以。
比方说,你有一个Layout
,在里面,你有很多Views
。 所以,如果你想以编程方式滚动到任何View
,你必须写下面的代码片段:
例如。
content_main.xml
<ScrollView android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/txtView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </ScrollView>
MainActivity.java
ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView); Button btn = (Button) findViewById(R.id.ivEventBanner); TextView txtView = (TextView) findViewById(R.id.ivEditBannerImage);
如果你想滚动到特定的View
让我们说在这种情况下txtview只是写:
scrollView.smoothScrollTo(txtView.getScrollX(),txtView.getScrollY());
你完成了。 。