试图了解 ScrollView 内 LinearLayout 的边距
Posted
技术标签:
【中文标题】试图了解 ScrollView 内 LinearLayout 的边距【英文标题】:Trying to understand margins in LinearLayout inside a ScrollView 【发布时间】:2011-11-24 06:45:58 【问题描述】:我需要在SrollView
内有一个LinearLayout
,并且LinearLayout
必须与ScrollView
有一个边距。起初,我能想到的解决该问题的唯一方法是在另一个 LinearLayout
中设置一个 LinearLayout
,并在最后一个布局上设置边距。如果设置在外部LinearLayout.
例子:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical"
android:fillViewport="true"
android:background="@color/layout_color_green">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
android:background="@color/layout_color_yellow">
<LinearLayout
android:layout_
android:layout_
android:layout_margin="10dp"
android:orientation="vertical"
android:background="@color/layout_color_blue">
</LinearLayout>
</LinearLayout>
</ScrollView>
我的问题是:我为什么需要这样做?
如果我只有一个LinearLayout
,就没有边距了...
例子:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical"
android:fillViewport="true"
android:background="@color/layout_color_green">
<LinearLayout
android:layout_
android:layout_
android:layout_margin="10dp"
android:orientation="vertical"
android:background="@color/layout_color_blue">
</LinearLayout>
</ScrollView>
然后,搜索一些类似的问题,我发现了一些布局,这些布局让我想到在ScrollView
中使用填充而不是在LinearLayout
中使用边距。这也解决了我的问题,我不需要另一个 LinearLayout
。这是一个更优雅的解决方案。
不过,我想了解为什么 LinearLayout
内的简单边距在 ScrollView
内不起作用。因为如果它不在ScrollView
内,它确实可以正常工作。
有人知道为什么吗?
【问题讨论】:
【参考方案1】:你好 Knickedi 和 Ricardo Amaral,
虽然这个答案被标记为已解决,但我想对这个问题做一些说明。
正如 Knickedi 所说,ScrollView 扩展了 FrameLayout。
所以我的回答是,您可以在 scrollView 中设置 LinearLayout 的 layout_gravity
,然后 layout_margin
将在 LinearLayout 中工作,就像 FrameLayout 中的 linearLayout 一样。
我有同样的问题,我已经应用了这个,它对我有用。 :)
例子:
<ScrollView
android:layout_
android:layout_>
<LinearLayout
android:layout_
android:layout_
android:layout_gravity="top"
android:layout_marginTop="30dp"
android:orientation="vertical" >
</ScrollView>
【讨论】:
【参考方案2】:我稍微挖掘了一下源代码:
ScrollView
扩展 FrameLayout
。这个本身有一些边际问题,ScrollView
甚至没有试图解决这个问题。测量时,边距基本上会被忽略。
但最终这并不重要,因为您应该能够在 ScrollView
本身上定义填充(这是一种肯定,没有尝试过)。单个子视图应该不需要边距。
【讨论】:
但问题是边距并不是唯一的问题。如果我将LinearLayout
高度设置为wrap_content
并将所有子级高度设置为match_parent
,则子级实际上将是fill_parent
,这是来自ScrollView
的值。而不是wrap_content
,它是来自LinearLayout
(它们的直接父级)的值。如果我在另一个内部使用一个LinearLayout
,这个问题也不会发生。所以我想ScrollView
的作用比我们所知道的还要多!?
当然可以。你用android:fillViewport="true"
强迫了这种行为。
那么,您是否建议我使用填充而不是边距并将LinearLayout
的所有子级设置为wrap_content
?
我不推荐填充,因为这是唯一的选择 ;-)android:fillViewport="false"
将不会强制 LinearLayout
为 fill_parent
,仅此而已。所以它不应该被拉伸,所以孩子们也不会。
我不知道该怎么做,因为这是一个更大问题的一部分,我在LinearLayout
中有一个GridView
,它在ScrollView
中。经过大量搜索和阅读后,我发现我不应该在ScrollView
中包含GridView
。我现在不知道如何做我的用户界面...... :(以上是关于试图了解 ScrollView 内 LinearLayout 的边距的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式在 UITableViewCell 内创建 UIScrollView - ScrollView 不滚动
水平 ScrollView 在 SwiftUI 中在更改时垂直反弹
SwiftUI - 试图在 ScrollView 中保持 View 的全屏大小