滚动视图没有重力。如何使滚动视图内的内容为中心
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
,它可以是FrameLayout
和android: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】:我认为更优雅的解决方案是使用ScrollView
的android: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 和 HorizontalScrollView。太感谢了! ?? 这可能会产生意想不到的效果,即在滚动视图中拉伸您的内容 @martinseal1987 我认为效果将取决于您的子组件,即您如何进行布局设计,尽管如果这对您不起作用,您可以根据您的设计制作自己的自定义滚动视图组件和工作需要。并请与我分享您想要的结果屏幕截图,以便我可以研究并提供您更好和更有效的解决方案。准备提供帮助。干杯。【参考方案5】:对于@Patrick_Boss - 在我的应用程序中阻止内容剪切的原因是将线性布局的重力和 layout_gravity 更改为 center_horizontal。
它对我有用……但不确定它是否对你有用。
修改@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
属性。
这可能是布局上最后解释的属性之一,它将覆盖其父级的重力设置(layout
或ScrollView
)。
【讨论】:
【参考方案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_
【讨论】:
以上是关于滚动视图没有重力。如何使滚动视图内的内容为中心的主要内容,如果未能解决你的问题,请参考以下文章