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(на панелі «Контур»), він виділяється червоною облямівкою, яка заповнює екран донизу, але коли я вибираю 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.
Пол Ламмертсма

Це справді допомагає. Дякую за це. Але без цього коду іноді добре працює. Ти знаєш чому?
Ashokchakravarthi Nagarajan

не працює для <LinearLayout android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: fillViewport = "true" android: background = "# 000" android: орієнтація = "вертикаль"> </LinearLayout>
Prasad

3
Настільки хворий, що я сидів годинами і шукав, що не так у моєму коді. Для чого цей параметр? Коли ви хотіли б встановити це значення false?
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, кнопки, спінер та ін. Потім додайте цей LinearLyout до ScrollView. Bcoz лише одна ДИТИНА для ScrollView застосовна і останнє додайте цей ScrollView до LinearLyout. Якщо визначена площа перевищена від розміру екрана, тоді ви отримаєте ScrollView ScrollView.


Але це рішення ускладнює xml та потребує більше часу, щоб надути.
twlkyao

1

У моєму випадку я не дав цього

орієнтація LinearLayout (дитина ScrollView)

Таким чином, за замовчуванням він займає горизонтальне, але прокручування прокрутки вертикально, тому перевірте, чи встановлено 'android: орієнтація = "вертикаль"' для дитини, що знаходиться у вашому ScrollView (у випадку LinearLayout).

Це був мій випадок, сподіваюся, що це комусь допоможе

.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.