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

Aru*_*ole 141 java android scrollview android-scrollview

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

我创建了动态TableLayout,放在一个ScrollView.所以我希望在特定的操作(如点击按钮等)上,特定的行应自动滚动到顶部位置.

可能吗?

erc*_*rcu 198

Pragna的答案总是不起作用,试试这个:

mScrollView.post(new Runnable() { 
        public void run() { 
             mScrollView.scrollTo(0, mScrollView.getBottom());
        } 
});
Run Code Online (Sandbox Code Playgroud)

要么

mScrollView.post(new Runnable() { 
        public void run() { 
             mScrollView.fullScroll(mScrollView.FOCUS_DOWN);
        } 
});
Run Code Online (Sandbox Code Playgroud)

如果你想滚动开始

mScrollView.post(new Runnable() { 
        public void run() { 
             mScrollView.fullScroll(mScrollView.FOCUS_UP);
        } 
});
Run Code Online (Sandbox Code Playgroud)

  • 我使用了`mScrollView.fullScroll(mScrollView.FOCUS_DOWN);`成功了. (28认同)
  • @HiteshDhamshaniya如果你想要一个平滑的滚动,请尝试`mScrollView.smoothScrollTo(0,mScrollView.getBottom());`. (5认同)
  • 我可以证实Vanthel的发现.mScrollView.fullScroll在post runnable中做了伎俩. (3认同)

And*_*oid 158

ScrollView sv = (ScrollView)findViewById(R.id.scrl);
sv.scrollTo(0, sv.getBottom());
Run Code Online (Sandbox Code Playgroud)

要么

sv.scrollTo(5, 10);

  • 结合ercu的答案和对它的评论,最好的方法似乎是:`mScrollView.post(new Runnable(){public void run(){mScrollView.fullScroll(View.FOCUS_DOWN);}});` (41认同)
  • 更好的滚动具有自然效果:sv.smoothScrollTo(5,10) (3认同)
  • scrollTo()不会产生欲望的反转.应该使用fullScroll() (2认同)

pat*_*ckf 34

我希望scrollView在onCreateView()之后直接滚动(不是在点击按钮之后).为了使它工作,我需要使用ViewTreeObserver:

mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            mScrollView.post(new Runnable() {
                public void run() {
                    mScrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
    });
Run Code Online (Sandbox Code Playgroud)

但请注意,每次调度时都会调用它(例如,如果将视图设置为不可见或相似),所以如果您不再需要它,请不要忘记删除此侦听器:

public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) 在SDK Lvl <16

要么

public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) 在SDK Lvl> = 16

  • 为什么平滑滚动不会工作而不是完整滚动? (2认同)

Mat*_*ero 20

这里有很多好的答案,但我只想补充一点.有时您希望将ScrollView滚动到布局的特定视图,而不是滚动到顶部或底部.

一个简单的例子:在注册表单中,如果用户在未填写表单的编辑文本时点击"注册"按钮,则需要滚动到该特定编辑文本以告知用户他必须填写该字段.

在这种情况下,你可以这样做:

scrollView.post(new Runnable() { 
        public void run() { 
             scrollView.scrollTo(0, editText.getBottom());
        } 
});
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要平滑滚动而不是即时滚动:

scrollView.post(new Runnable() { 
            public void run() { 
                 scrollView.smoothScrollTo(0, editText.getBottom());
            } 
    });
Run Code Online (Sandbox Code Playgroud)

显然,您可以使用任何类型的视图而不是编辑文本.请注意,getBottom()根据其父布局返回视图的坐标,因此ScrollView中使用的所有视图应仅具有父级(例如,线性布局).

如果您在ScrollView的子项中有多个父项,我找到的唯一解决方案是在父视图上调用requestChildFocus:

editText.getParent().requestChildFocus(editText, editText);
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,你不能有一个平滑的滚动.

我希望这个答案可以帮助有同样问题的人.


Sri*_*lla 19

使用这样的东西:

mScrollView.scrollBy(10, 10);
Run Code Online (Sandbox Code Playgroud)

要么

mScrollView.scrollTo(10, 10);
Run Code Online (Sandbox Code Playgroud)


blu*_*con 9

尝试使用scrollTo方法更多信息


Mad*_*ddy 8

如果您想立即滚动,那么您可以使用:

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);              
    }
});
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要平滑且缓慢地滚动,那么您可以使用:

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();
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

**向上滚动到所需的高度。我想出了一些很好的解决方案**

                scrollView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        scrollView.scrollBy(0, childView.getHeight());
                    }
                }, 100);
Run Code Online (Sandbox Code Playgroud)


Pan*_*lan 5

是的你可以。

假设你有一个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>
Run Code Online (Sandbox Code Playgroud)

主活动.java

ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView);
Button btn = (Button) findViewById(R.id.ivEventBanner);
TextView txtView = (TextView) findViewById(R.id.ivEditBannerImage);
Run Code Online (Sandbox Code Playgroud)

如果你想滚动到一个特定的View,比方说txtview,在这种情况下,只需写:

scrollView.smoothScrollTo(txtView.getScrollX(),txtView.getScrollY());
Run Code Online (Sandbox Code Playgroud)

你已经完成了。