滚动视图没有重力。如何使scrollview内部的内容为中心


104

我想将scrollView中的内容作为中心。

<ScrollView
    android:id="@+id/scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay"
    android:layout_gravity="center" >

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="check" 
        android:gravity="center_vertical|center_horizontal"/>

</ScrollView>

注意:没有android:gravity scrollvew属性。

任何溶胶:

Answers:


175

我遇到了同样的问题,最后弄清楚了。这是垂直的ScrollView

将您的ScrollView放入a RelativeLayout并将其居中RelativeLayout。为了使它起作用,您ScrollView应该

android:layout_height="wrap_content"

最终代码应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_centerVertical="true" >

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b1"/>
            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b2"/>
            <Button
                android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b3"/>
        </LinearLayout>

    </ScrollView>

</RelativeLayout>

29
这似乎比接受的答案对我来说更好。谢谢!
Patrick Boos

理想情况下,当布局层次结构存在时,android应该调查此问题。还应该在一个scrollview.BTW中提供两个滚动(水平/垂直)选项。BTW感谢@hadi
mayank_droid 2015年

2
这有点骇人听闻,所以虽然工作正常,但感觉不对。
DariusL,2015年

3
嘿,它正常工作,但是在键盘可见时不滚动,我尝试添加清单,android:windowSoftInputMode="stateHidden|adjustResize"但是,请不要滚动,请帮助我
Helio Soares Junior

3
无需使用沉重的RelativeLayout根视图。它可以是FrameLayout并且android:layout_gravity="center_vertical"ScrollView
GrafOrlov

148

这个怎么样?

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay" >


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:layout_gravity="center"
        android:gravity="center">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" 
            android:gravity="center_vertical|center_horizontal"/>
    </LinearLayout>

</ScrollView>

2
是的 那个怎么样!这对我来说效果非常好,非常感谢您,先生。
RileyE

太棒了!这也救了我!谢谢:)
marienke

101
这有一个问题。如果ScrollView中的内容大于滚动视图,它将仍然居中并在顶部截断内容(虽然不确定为什么)。意味着您无法在此处滚动。
Patrick Boos,

7
PatrickBoos是正确的;这似乎不起作用。在下面使用hadi的答案,将滚动视图在RelativeLayout中垂直居中。
梅森·李

是的,这种方式有bug,内容大于scrollView,内容不会滚动到顶部,他的顶部是负数,很奇怪:(
Kross

98

我认为更优雅的解决方案是使用ScrollViewandroid:fillViewport属性。ScrollView即使在将match_parentfill_parent)设置为时,A 对待内容视图的方式也有所不同(只能有一个),但ScrollView它不会为内容视图提供太大的间距,而是默认行为是将ScrollView其包装内容,无论您为该视图指定什么内容。什么android:fillViewport是告诉ScrollView拉伸其内容以填充视口(http://developer.android.com/reference/android/widget/ScrollView.html#attr_android:fillViewport)。所以在这种情况下,LinearLayout将被拉伸以匹配视口,并且如果高度在视口之后,那么它将可以滚动,这正是您想要的!

当内容扩展到之外时,可接受的答案将无法正常工作,ScrollView因为它仍将首先使内容视图居中,从而导致该视图的一部分被切掉,并且ScrollView而居中放置在另一个布局中,但感觉不佳,此外我认为这也会导致皮棉错误(无用的父级或类似的东西)。

尝试这样的事情:

<ScrollView
    android:id="@+id/scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay"
    android:fillViewport="true">

    <LinearLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" />

    </LinearLayout>

</ScrollView>

请记住,它正在这里现在中心的原因是因为android:gravityLinearLayoutScrollView会拉长LinearLayout所以记住这一点取决于你添加到布局什么。

ScrollView尽管不是关于居中而是关于居中的另一本好书,fillViewporthttp://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/


11
这看起来是最正确的实现,不需要额外的视图。
DariusL,2015年

1
好的解决方案,对于我来说似乎是最干净的解决方案。谢谢
本杰明·沙尔鲍

2
比接受的答案更好,您为我节省了很多时间!真的做得好Brian Ethier!
Mattia Ruggiero

由于上面描述的所有原因,这是正确的解决方案。 。应该接受这作为适当的解决方案
Speckpgh '18

1
典型的Stackoverflow ..正确的解决方案通常位于中间位置。
Teovald

14

在ScrollView中使用此属性

android:fillViewport="true"

 <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarStyle="outsideOverlay"
android:fillViewport="true"
>
   <RelativeLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content">

         <!--Your Code goes here-->

   </RelativeLayout>

</ScrollView>

确保像上面的示例中的Relativelayout一样,在ScrollView中使用Single Child。


@JoshuaKing可能是因为它有7年历史了,我9个月前才发布了这个答案。
Abhishek Garg,

哈!哦..真相。😆很好,它运作良好!那谢谢啦!
约书亚国王

1
这绝对应该是公认的答案!如果内容小于容器大小,它可以完美地工作并使ScrollView居中。适用于ScrollView和Horizo​​ntalScrollView。非常感谢!💝💖
雷力

这可能会产生意想不到的效果,即在滚动视图中拉伸内容
martinseal1987 '19

我认为@ martinseal1987的效果将取决于您的子组件,即您如何进行布局设计,但是,如果这对您不起作用,则可以根据设计和工作需要来制作自己的自定义滚动视图组件。并请与我分享您想要的结果屏幕截图,以便我调查并提供更好的解决方案。准备提供帮助。干杯。
Abhishek Garg,

9

对于@Patrick_Boss-在我的应用程序中阻止剪切内容的原因是将LinearLayout的重力和layout_gravity更改为center_horizo​​ntal。

它对我有用...但是不确定是否对您有用。

修改@Ghost的答案-

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay" >


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" 
            android:gravity="center_vertical|center_horizontal"/>
    </LinearLayout>

</ScrollView>

1
这解决了切断自上而下的问题。但是这种解决方案仍然存在一个问题。ScrollView内容未垂直居中。但这可以通过设置以下ScrollView值来解决:android:layout_height =“ wrap_content” android:layout_gravity =“ center_vertical”
Patrick Boos

我发现要使其在其他布局中起作用,必须将顶部ScrollView嵌入到FrameLayout中。
Theo

1

要考虑的一件事是不设置什么。请确保你的孩子的控制,特别是EditText控制,不会RequestFocus属性集。

这可能是布局上最后解释的属性之一,它将覆盖其父级layoutScrollView上的重力设置


0

使用ConstraintLayout内的滚动视图。对我有用

<androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white">

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" />
            </ScrollView>
        </androidx.constraintlayout.widget.ConstraintLayout>

滚动视图高度应为wrap_content

<ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.