我可以在Android中以编程方式滚动ScrollView吗?

有什么办法滚动ScrollView编程方式到某个位置?

我创build了一个放置在ScrollViewdynamicTableLayout 。 所以我想要一个特定的行动(如点击一个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()); 

完成了。