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

Posted

技术标签:

【中文标题】滚动视图没有重力。如何使滚动视图内的内容为中心【英文标题】:no gravity for scrollview. how to make content inside scrollview as center 【发布时间】:2012-02-17 14:51:35 【问题描述】:

我想以scrollView里面的内容为中心。

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

    <Button 
        android:layout_ 
        android:layout_ 
        android:text="check" 
        android:gravity="center_vertical|center_horizontal"/>

</ScrollView>

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

任何溶胶:-

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,终于解决了。这是一个垂直的ScrollView

将您的ScrollView 放入RelativeLayout 并将其置于RelativeLayout 的中心。为了让它工作,你的ScrollView 应该有

android:layout_

这是最终代码的样子:

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

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_
        android:layout_ 
        android:layout_centerVertical="true" >

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_
            android:layout_
            android:orientation="vertical">

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

    </ScrollView>

</RelativeLayout>

【讨论】:

这个对我来说似乎比接受的答案更好。谢谢! 理想情况下,当存在布局层次结构时,android 应该考虑这个问题。还应该在一个滚动视图中同时提供滚动(水平/垂直)选项。顺便说一句,感谢@hadi 这有点小题大做,所以虽然效果很好,但它感觉错了。 嘿它的工作,但当键盘可见时不滚动,我尝试添加清单android:windowSoftInputMode="stateHidden|adjustResize" 但是,不要滚动,请帮助我 无需使用繁重的RelativeLayout 作为根视图。对于ScrollView,它可以是FrameLayoutandroid:layout_gravity="center_vertical"【参考方案2】:

这个怎么样?

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


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_
        android:layout_
        android:orientation="vertical" 
        android:layout_gravity="center"
        android:gravity="center">

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

</ScrollView>

【讨论】:

是的!那个怎么样!这对我来说非常有用,非常感谢您,好心的先生。 太棒了!这也救了我!谢谢:) 这有一个问题。如果您在 ScrollView 中的内容大于滚动视图,它仍会将其居中并在顶部截断内容(但尚不确定为什么)。这意味着你不能在那里滚动。 PatrickBoos 是对的;这似乎不起作用。在下面使用 hadi 的答案,将滚动视图垂直居中在相对布局中。 是的,这种方式有bug,内容大于scrollView,内容不会滚动到顶部,他的顶部是负数,奇怪:(【参考方案3】:

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

当内容超出ScrollView 时,接受的答案将无法正常工作,因为它仍然会首先使内容视图居中导致它切断一部分视图,而ScrollView 在另一个布局中居中工作但感觉不对,此外我认为它还会导致 lint 错误(无用的父级或类似的东西)。

试试这样的:

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

    <LinearLayout
        android:id="@+id/content"
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:gravity="center">

        <Button
            android:id="@+id/button"
            android:layout_
            android:layout_
            android:text="check" />

    </LinearLayout>

</ScrollView>

请记住,它现在居中的原因是因为LinearLayout 上的android:gravity,因为ScrollView 会拉伸LinearLayout,因此请记住这一点,具体取决于您添加到布局中的内容.

关于ScrollView 的另一个好读物是http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/,虽然不是关于居中,而是关于fillViewport

【讨论】:

这看起来是最正确的实现,不需要额外的视图。 不错的解决方案,对我来说似乎是最干净的解决方案。谢谢你 比公认的答案更好,你为我节省了很多时间! Brian Ethier 干得真好! 这是正确的解决方案,出于其中描述的所有原因。如果您尝试上面的解决方案,并且您的滚动视图比您的屏幕宽,您确实会有部分滚动视图无法访问并且无法滚动到它...这应该被接受为正确的解决方案 典型的 *** .. 正确的解决方案通常在中间的某个地方。【参考方案4】:

在 ScrollView 中使用该属性

android:fillViewport="true"

示例

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

         <!--Your Code goes here-->

   </RelativeLayout>

</ScrollView>

确保在 ScrollView 中使用 Single Child,就像上面的示例中的相对布局一样。

【讨论】:

@JoshuaKing 可能是因为这是 7 年前的问题,而我最近在 9 个月前发布了这个答案。 哈!哦..真相。 ?嗯,效果很好!所以谢谢! 这绝对应该是公认的答案!如果内容小于容器大小,它可以完美地工作并居中 ScrollView。适用于 ScrollView 和 Horizo​​ntalScrollView。太感谢了! ?? 这可能会产生意想不到的效果,即在滚动视图中拉伸您的内容 @martinseal1987 我认为效果将取决于您的子组件,即您如何进行布局设计,尽管如果这对您不起作用,您可以根据您的设计制作自己的自定义滚动视图组件和工作需要。并请与我分享您想要的结果屏幕截图,以便我可以研究并提供您更好和更有效的解决方案。准备提供帮助。干杯。【参考方案5】:

对于@Patrick_Boss - 在我的应用程序中阻止内容剪切的原因是将线性布局的重力和 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_
    android:layout_
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay" >


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_
        android:layout_
        android:orientation="vertical" 
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal">

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

</ScrollView>

【讨论】:

这解决了切断顶部的问题。但是这个解决方案仍然存在一个问题。 ScrollView 内容未垂直居中。但这可以通过设置 ScrollView 的以下值来解决: android:layout_ android:layout_gravity="center_vertical" 我发现要让它在其他布局中工作,顶部的 ScrollView 必须嵌入到 FrameLayout 中。【参考方案6】:

需要考虑的一点是不要设置。确保您的子控件,尤其是 EditText 控件,没有设置了 RequestFocus 属性。

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

【讨论】:

【参考方案7】:

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

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

            <ScrollView
                android:layout_
                android:layout_
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <LinearLayout
                    android:layout_
                    android:layout_
                    android:orientation="vertical" />
            </ScrollView>
        </androidx.constraintlayout.widget.ConstraintLayout>

滚动视图高度应为 wrap_content

<ScrollView
            android:layout_
            android:layout_

【讨论】:

以上是关于滚动视图没有重力。如何使滚动视图内的内容为中心的主要内容,如果未能解决你的问题,请参考以下文章

滚动视图内的Android约束布局高度无效

如何使带有选项卡视图的视图可滚动?

如何使用滚动视图使隐藏的按钮菜单出现/消失?

没有在 RecyclerView 上工作 Notifydatasetchange 与中心选择水平滚动视图?

iOS应用程序中的滚动视图内容中心对齐[关闭]

如何确定滚动视图中当前可见的区域并确定中心?