LinearLayout non si espande all'interno di ScrollView


371

Ho un LinearLayoutinterno ScrollViewche ha android:layout_height="fill_parent", ma non si espande fino all'altezza massima di ScrollView. Il mio layout è simile al seguente:

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

Vedo che il LinearLayoutnon espande l'intera altezza del ScrollViewperché in Eclipse in Android Layout Editor, se seleziono ScrollView(nel pannello Contorno) viene evidenziato con un bordo rosso che riempie lo schermo fino in fondo ma quando seleziono il LinearLayoutpunto saliente non si espande nella parte inferiore dello schermo. Come posso farlo farlo?

L'effetto che sto cercando di ottenere è avere un po 'di testo e un pulsante sotto di esso (all'interno del LinearLayoutlivello 4 c'è solo un pulsante). Il testo può essere abbastanza grande da richiedere una barra di scorrimento, nel qual caso voglio che l'utente debba scorrere verso il basso per vedere il pulsante. Nel caso in cui il testo non sia abbastanza grande per una barra di scorrimento, voglio LinearLayoutche il pulsante contenente si attacchi alla parte inferiore dello schermo.

All'inizio ho pensato che non avrei dovuto pubblicare l'intero XML perché di solito è una svolta per vedere un grosso pezzo di codice in una domanda. Tuttavia, sembra che potrebbe essere necessario, quindi ecco il layout completo.

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

Al momento ho fatto ricorso al android:layout_gravity="bottom"problema LinearLayout, che fa in modo che il pulsante si attacchi alla parte inferiore dello schermo, qualunque cosa accada. Ma ciò rende anche il testo aderire alla parte inferiore dello schermo, che non è esattamente quello che stavo cercando.

Aggiornamento: grattalo, android:layout_gravity="bottom"rende l' ScrollViewimpossibile, beh, scorrere. Altre idee?

Risposte:


956

Ho trovato la soluzione me stesso alla fine. Il problema non era con il LinearLayout, ma con il ScrollView(sembra strano, considerando il fatto che si ScrollView stava espandendo, mentre il LinearLayoutnon lo era).

La soluzione era usare android:fillViewport="true"sul ScrollView.


4
Si noti che LinearLayout si espanderà verticalmente, ma ciò potrebbe non riflettersi necessariamente nel layout a meno che non contenga un controllo che utilizza tale spazio aggiuntivo android:weight.
Paul Lammertsma,

Questo aiuta davvero. Grazie per quello Ma senza questo codice a volte funziona bene. Sai perché?
Ashokchakravarthi Nagarajan,

non funziona per <Android di LinearLayout: layout_width = "fill_parent" android: layout_height = "wrap_content" android: fillViewport = "true" android: background = "# 000" android: orientation = "vertical"> </LinearLayout>
Prasad

3
Così malato stavo seduto per ore a cercare cosa non andava nel mio codice. Per cosa questo paramater? Quando vorresti mai impostarlo falso?
MyWay,

@Prasad crea la tua altezza del layout lineare in modo che corrisponda al genitore
goonerDroid

22

So che questo post è molto vecchio, per coloro che non vogliono usarlo android:fillViewport="true"perché a volte non fa apparire l'edittext sopra la tastiera. Usa il layout relativo invece di LinearLayout risolve lo scopo.


8

Puoi fornire il tuo layout xml? Ciò consentirebbe alle persone di ricreare il problema con il minimo sforzo.

Potrebbe essere necessario impostare

android:layout_weight="1"

per l'elemento che si desidera espandere


1
La ringrazio per la risposta. Ho provato il tuo suggerimento ma non ha funzionato. Ho anche aggiornato la mia domanda per includere il layout xml.
Felix,

3

La soluzione è usare

android:fillViewport="true"

sulla vista di scorrimento e inoltre provare a utilizzare

"wrap_content"invece di "fill_parent"come"fill_parent"

è deprecato ora.


2

Ho usato dinamicamente per ottenere questo. Ho un LinearLayout e all'interno di questo ho usato ScrollView da bambino. Quindi prendo di nuovo LinearLayout e aggiungo tutto quello che vuoi Visualizza su questo LinearLayout e poi questo LinearLayout aggiungi a ScrollView e infine aggiungo ScrollView a LinearLayout. Quindi puoi ottenere lo scorrimento nel tuo ScrollView e nulla sarà lasciato visibile.

LinearLayout (Parent) - ScrollView (figlio di LinerLayout) - LinearLayout (figlio di ScrollView) - aggiungi qui textView, Pulsanti, spinner ecc. Quindi aggiungere questo LinearLyout a ScrollView. Bcoz solo un BAMBINO per ScrollView applicabile e ultimo aggiungere questo ScrollView a LinearLyout.Se l'area definita è superiore alle dimensioni dello schermo, si otterrà uno Scroll all'interno di ScrollView.


Ma questa soluzione rende l'xml più complicato e richiede più tempo per gonfiarsi.
twlkyao,

1

Nel mio caso non ho dato il

orientamento di LinearLayout (ScrollView's Child)

Quindi, per impostazione predefinita, ci vuole orizzontale, ma scrollview scorre in verticale, quindi per favore controlla se 'android: orientamento = "vertical"' è impostato su Child di ScrollView (nel caso di LinearLayout).

Questo è stato il mio caso spera che aiuti qualcuno

.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.