Попытка понять поля в LinearLayout внутри ScrollView - PullRequest
24 голосов
/ 24 сентября 2011

Мне нужно иметь 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 022 Пример: * 1 023 *
<?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.

Кто-нибудь знает почему?

Ответы [ 2 ]

16 голосов
/ 24 сентября 2011

Я немного покопался в исходном коде:

ScrollView extends FrameLayout.У этой проблемы есть некоторые проблемы с маржой, и ScrollView даже не пытается ее решить.При измерении поля в основном игнорируются.

Но, в конце концов, это не имеет значения, так как вы должны иметь возможность определить отступ для самого ScrollView (это утверждение, не пытайтесь этого).Не должно быть необходимости в полях для одного дочернего представления.

11 голосов
/ 03 ноября 2012

Здравствуйте, Knickedi и Рикардо Амарал,

Хотя этот ответ помечен как решенный, но я хочу осветить этот вопрос.

Как сказал Knickedi, ScrollView расширяет FrameLayout.

Поэтому мой ответ таков: вы можете установить layout_gravity LinearLayout в scrollView, и тогда layout_margin будет работать в LinearLayout, как в случае с linearLayout в FrameLayout.

У меня была такая же проблема, и я применилэто и у меня сработало.:)

Пример:

<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>
...