LinearLayout no se expande dentro de una Vista de desplazamiento

371

Tengo un LinearLayoutinterior ScrollViewque tiene android:layout_height="fill_parent", pero no se expande a la altura total del ScrollView. Mi diseño se parece a:

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

Puedo ver que LinearLayoutno se expande la altura completa del ScrollViewporque, en Eclipse Android Layout Editor, si selecciono el ScrollView(en el panel Esquema) se resalta con un borde rojo que llena la pantalla hasta el fondo, pero cuando selecciono el LinearLayoutresaltado no se expande a la parte inferior de la pantalla. ¿Cómo puedo conseguir que lo haga?

El efecto que intento lograr es tener algo de texto y un botón debajo (dentro del LinearLayoutnivel 4 solo hay un botón). El texto puede ser lo suficientemente grande como para necesitar una barra de desplazamiento, en cuyo caso quiero que el usuario tenga que desplazarse hacia abajo para ver el botón. En caso de que el texto no sea lo suficientemente grande para una barra de desplazamiento, quiero LinearLayoutque el botón que contiene se pegue en la parte inferior de la pantalla.

Al principio pensé que no debería publicar el XML completo porque generalmente es un rechazo para ver una gran porción de código en una pregunta. Sin embargo, parece que podría ser necesario, así que aquí está el diseño 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>

En este momento he recurrido a android:layout_gravity="bottom"la problemática LinearLayout, lo que hace que el botón se pegue en la parte inferior de la pantalla sin importar qué. Pero eso también hace que el texto se pegue en la parte inferior de la pantalla, que no es exactamente lo que buscaba.

Actualización: rasca eso, android:layout_gravity="bottom"hace que ScrollViewno puedas, bueno, desplazarte. ¿Otras ideas?

Felix
fuente

Respuestas:

956

Encontré la solución yo mismo al final. El problema no era con el LinearLayout, sino con el ScrollView(parece extraño, considerando el hecho de que se ScrollView estaba expandiendo, mientras que el LinearLayoutno).

La solución fue utilizar android:fillViewport="true"en el ScrollView.

Felix
fuente
44
Tenga en cuenta que LinearLayout se expandirá verticalmente, pero esto no necesariamente se reflejará en su diseño a menos que contenga un control que consuma ese espacio adicional utilizando android:weight.
Paul Lammertsma
Esto realmente ayuda. Gracias por eso. Pero sin este código a veces funciona bien. ¿Sabes por qué?
Ashokchakravarthi Nagarajan
no funciona para <LinearLayout android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: fillViewport = "true" android: background = "# 000" android: orientación = "vertical"> </LinearLayout>
Prasad
3
Estaba tan enfermo que estuve sentado durante horas y buscando qué hay de malo en mi código. ¿Para qué este paramater? ¿Cuándo alguna vez te gustaría ponerlo falso?
MyWay
@Prasad hace que su altura de diseño lineal coincida con la de los padres
goonerDroid
22

Sé que esta publicación es muy antigua, para aquellos que no quieren usarla android:fillViewport="true"porque a veces no aparece el texto de edición sobre el teclado. Utilice el diseño relativo en lugar de LinearLayout, resuelve el propósito.

Hardik4560
fuente
8

¿Puedes proporcionar tu diseño xml? Hacerlo permitiría a las personas recrear el problema con un mínimo esfuerzo.

Puede que tenga que configurar

android:layout_weight="1"

para el artículo que desea expandir

snctln
fuente
1
Gracias por su respuesta. Intenté tu sugerencia pero no funcionó. También actualicé mi pregunta para incluir el diseño xml.
Felix
3

La solución es usar

android:fillViewport="true"

en la vista de desplazamiento y, además, intente usar

"wrap_content"en lugar de "fill_parent"como"fill_parent"

está en desuso ahora.

Khushboo Aggarwal
fuente
2

Lo he usado dinámicamente para obtener esto. Tengo un LinearLayout y dentro de esto utilicé ScrollView cuando era niño. Luego tomo nuevamente LinearLayout y agrego lo que quiera ver a este LinearLayout y luego este LinearLayout agrega a ScrollView y finalmente agrega este ScrollView a LinearLayout. Entonces puede obtener desplazamiento en su ScrollView y no quedará nada visible.

LinearLayout (Parent) - ScrollView (child of LinerLayout) - LinearLayout (child of ScrollView) - agregue aquí textView, Buttons, spinner, etc. lo que desee. Luego agregue este LinearLyout a ScrollView. Bcoz solo un NIÑO para ScrollView aplicable y, por último, agregue este ScrollView a LinearLyout. Si el área definida es superior al tamaño de la pantalla, obtendrá un desplazamiento dentro de ScrollView.

Braj
fuente
Pero esta solución hace que el xml sea más complicado y tarda más tiempo en inflarse.
twlkyao
1

En mi caso no he dado el

orientación de LinearLayout (ScrollView's Child)

Entonces, de manera predeterminada, toma horizontal, pero scrollview se desplaza verticalmente, así que verifique si 'android: orientación = "vertical"' está configurado en el elemento secundario de su ScrollView (en el caso de LinearLayout).

Este fue mi caso, espero que ayude a alguien

.

Vishal Pandey
fuente