web-dev-qa-db-ja.com

ScrollView内のLinearLayoutのマージンを理解しようとしています

LinearLayoutの中にSrollViewが必要であり、そのLinearLayoutにはScrollViewからのマージンが必要です。最初、この問題を解決するために考えられる唯一の方法は、この最後のレイアウトにマージンを設定して、別のLinearLayout内にLinearLayoutを配置することでした。外側に設定されていると機能しませんLinearLayout.

例:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical"
    Android:fillViewport="true"
    Android:background="@color/layout_color_green">
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical"
        Android:background="@color/layout_color_yellow">
        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_margin="10dp"
            Android:orientation="vertical"
            Android:background="@color/layout_color_blue">
        </LinearLayout>
    </LinearLayout>
</ScrollView>

enter image description here

私の質問は:なぜこれを行う必要があるのですか?

LinearLayoutが1つしかない場合、マージンはありません...

例:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical"
    Android:fillViewport="true"
    Android:background="@color/layout_color_green">
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_margin="10dp"
        Android:orientation="vertical"
        Android:background="@color/layout_color_blue">
    </LinearLayout>
</ScrollView>

enter image description here

次に、同様の問題を検索して、ScrollViewのマージンの代わりにLinearLayoutのパディングを使用するというアイデアを与えてくれるレイアウトをいくつか見つけました。これも私の問題を解決し、別の問題の中にLinearLayoutは必要ありません。これは、よりエレガントなソリューションです。

それでも、LinearLayout内でScrollView内の単純なマージンが機能しない理由を理解したいと思います。 ScrollView内にない場合は、正常に機能するためです。

誰もが理由を知っていますか?

24
rfgamaral

私はソースコードを少し掘り下げました:

ScrollViewFrameLayoutを拡張します。これにはマージンの問題がいくつかあり、ScrollViewはそれを解決しようとさえしていません。測定中、マージンは基本的に無視されます。

しかし、最終的にはScrollView自体にパディングを定義できるはずなので、それは問題ではありません(これは肯定ですが、試していません)。単一の子ビューにマージンは必要ありません。

16
Knickedi

こんにちは、ニケディとリカルド・アマラル、

この回答は解決済みとしてマークされていますが、この問題にいくつかの光を当てたいと思います。

Knickediが言ったように、ScrollViewはFrameLayoutを拡張します。

したがって、私の答えは、scrollView内でLinearLayoutのlayout_gravityを設定すると、FrameLayout内のlinearLayoutの場合と同様にlayout_marginがLinearLayoutで機能するということです。

私は同じ問題を抱えていました、そして私はこれを適用しました、そしてそれは私のために働きました。 :)

例:

<ScrollView
                Android:layout_width="fill_parent"
                Android:layout_height="fill_parent">

                <LinearLayout
                    Android:layout_width="fill_parent"
                    Android:layout_height="wrap_content"
                    Android:layout_gravity="top"
                    Android:layout_marginTop="30dp"
                    Android:orientation="vertical" >
</ScrollView>
11
hims_3009