LinearLayout не расширяется внутри ScrollView


371

У меня есть LinearLayoutвнутренняя часть, ScrollViewкоторая имеет android:layout_height="fill_parent", но она не расширяется до полной высоты ScrollView. Мой макет выглядит примерно так:

level    layout    layout_width    layout_height
1    LinearLayout    fill_parent    fill_parent
2    LinearLayout    fill_parent    wrap_content
3    (some irrelevant stuff)
2    ScrollView      fill_parent    fill_parent <-- this expands full height
3    LinearLayout    fill_parent    fill_parent <-- this does not (has orientation=vertical)
(following stuff probably are irrelevant, but just to be sure:)
4    TextView        fill_parent    fill_parent
4    LinearLayout    fill_parent    wrap_content

Я вижу, что LinearLayoutэто не увеличивает полную высоту, ScrollViewпотому что в Eclipse in Android Layout Editor, если я выбираю ScrollView(на панели Outline), он выделяется красной рамкой, которая заполняет экран до дна, но когда я выбираю LinearLayoutего подсветку не расширяется до нижней части экрана. Как я могу заставить это сделать это?

Эффект, которого я пытаюсь добиться, - это иметь некоторый текст и кнопку под ним (внутри на LinearLayoutуровне 4 есть только кнопка). Текст может быть достаточно большим, чтобы иметь полосу прокрутки, и в этом случае я хочу, чтобы пользователю пришлось прокручивать страницу вниз, чтобы увидеть кнопку. В случае, если текст недостаточно велик для полосы прокрутки, я хочу, чтобы LinearLayoutсодержащая кнопка прилипла к нижней части экрана.

Сначала я подумал, что не должен публиковать полный XML, потому что обычно отказывается видеть огромный кусок кода в вопросе. Тем не менее, кажется, что это может быть необходимо, поэтому вот полный макет.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/video_layout"
        android:focusable="true"
        style="@style/VideoLayout">
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:foreground="@android:drawable/ic_media_play"
            android:foregroundGravity="center">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/video_thumb"
                android:padding="5dip"
                android:background="#454545"/>
        </FrameLayout>
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:focusable="true"
            style="@style/VideoTitle"
            android:id="@+id/video_title"
            android:layout_gravity="center"
            android:layout_weight="1"/>
    </LinearLayout>
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
        <!-- this ScrollView expands the full height of the screen.
             However, the next LinearLayout does not expand the full height of the ScrollView -->
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:layout_gravity="fill"
            android:orientation="vertical"
            android:id="@+id/info_layout">
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/info_body"
                style="@style/InfoText"/>
            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                style="@android:style/ButtonBar">
                    <Button
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:layout_weight="1"
                        android:text="@string/button_readmore"
                        android:id="@+id/btn_read_more"/>
            </LinearLayout>
        </LinearLayout>
    </ScrollView>
</LinearLayout>

На данный момент я прибег к android:layout_gravity="bottom"проблемному LinearLayout, что делает кнопку прилипать к нижней части экрана, несмотря ни на что. Но это также заставляет текст придерживаться нижней части экрана, что не совсем то, что я был после.

Обновление: поцарапать, что android:layout_gravity="bottom"делает ScrollViewневозможным, ну, прокручивать. Другие идеи?

Ответы:


956

Сам нашел решение в итоге. Проблема была не с LinearLayout, но с ScrollView(кажется странным, учитывая тот факт , что ScrollView было расширение, в то время LinearLayoutне было).

Решение было использовать android:fillViewport="true"на ScrollView.


4
Обратите внимание, что LinearLayout будет расширяться по вертикали, но это не обязательно будет отражено в макете, если только он не содержит элемент управления, который потребляет это дополнительное пространство android:weight.
Пол Ламмерцма

Это действительно помогает. Спасибо за это. Но без этого кода иногда работает хорошо. Ты знаешь почему?
Ашокчакраварти Нагараджан

не работает для <LinearLayout android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: fillViewport = "true" android: background = "# 000" android: direction = "vertical"> </ LinearLayout>
Прасад,

3
Так плохо, что я часами сидел и искал что не так с моим кодом. Для чего этот параматер? Когда вы когда-нибудь хотели бы установить это ложным?
MyWay

@Prasad сделай свой рост линейного расположения, чтобы соответствовать родителю
goonerDroid

22

Я знаю, что этот пост очень старый, для тех, кто не хочет его использовать, android:fillViewport="true"потому что иногда он не отображает текст редактирования над клавиатурой. Используйте Относительное расположение вместо LinearLayout, это решает цель.


8

Можете ли вы предоставить свой макет XML? Это позволит людям воссоздать проблему с минимальными усилиями.

Возможно, вам придется установить

android:layout_weight="1"

для элемента, который вы хотите расширить


1
Спасибо за ваш ответ. Я попробовал ваше предложение, но оно не сработало. Я также обновил свой вопрос, чтобы включить макет XML.
Феликс

3

Решение заключается в использовании

android:fillViewport="true"

на просмотр прокрутки и более того, попробуйте использовать

"wrap_content"а не "fill_parent"как"fill_parent"

устарела сейчас.


2

Я динамически использовал, чтобы получить это. У меня есть LinearLayout и в этом используется ScrollView, как ребенок. Затем я снова беру LinearLayout и добавляю все, что вы хотите, к этому LinearLayout, а затем это LinearLayout добавляете в ScrollView и, наконец, добавляете этот ScrollView к LinearLayout. Тогда вы можете получить прокрутку в вашем ScrollView и ничего не останется видимым.

LinearLayout (Parent) - ScrollView (дочерний элемент LinerLayout) - LinearLayout (дочерний элемент ScrollView) - добавьте сюда textView, Buttons, spinner и т. Д. Все, что вы хотите. Затем добавьте этот LinearLyout в ScrollView. Bcoz применим только один РЕБЕНОК для ScrollView и в последний раз добавьте этот ScrollView в LinearLyout. Если определенная область превышает размер экрана, то вы получите Scroll в ScrollView.


Но это решение делает XML более сложным и требует больше времени для раздувания.
Twlkyao

1

В моем случае я не дал

ориентация LinearLayout (дочерний элемент ScrollView)

Поэтому по умолчанию это занимает горизонтальное положение, но прокрутка прокручивается по вертикали, поэтому, пожалуйста, проверьте, установлен ли параметр 'android: ориентация = "вертикальный" для дочернего элемента ScrollView (в случае LinearLayout).

Это был мой случай, надеюсь, это кому-нибудь поможет

,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.