试图了解 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"不会强制 LinearLayoutfill_parent,仅此而已。所以它不应该被拉伸,所以孩子们也不会。 我不知道该怎么做,因为这是一个更大问题的一部分,我在LinearLayout 中有一个GridView,它在ScrollView 中。经过大量搜索和阅读后,我发现我不应该在ScrollView 中包含GridView。我现在不知道如何做我的用户界面...... :(

以上是关于试图了解 ScrollView 内 LinearLayout 的边距的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在 UITableViewCell 内创建 UIScrollView - ScrollView 不滚动

水平 ScrollView 在 SwiftUI 中在更改时垂直反弹

Harmony OS — ScrollView滑动视图

SwiftUI - 试图在 ScrollView 中保持 View 的全屏大小

ScrollView 在 Xamarin Forms 中的另一个 ScrollView 内

在 ScrollView 中的 EditText 内滚动 [重复]