android - studio - LinearLayout no se expande dentro de un ScrollView
scroll android linearlayout (6)
Tengo un LinearLayout
dentro de un ScrollView
que tiene android:layout_height="fill_parent"
, pero no se expande a la altura completa del ScrollView
. Mi diseño se ve algo así como:
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 LinearLayout
no expande la altura completa de ScrollView
porque en Eclipse en el Android Layout Editor
, si selecciono ScrollView
(en el panel de esquema) está resaltado con un borde rojo que llena la pantalla hasta el final, pero cuando selecciono LinearLayout
su resalte no se expande a la parte inferior de la pantalla. ¿Cómo puedo conseguir que lo haga?
El efecto que estoy tratando de lograr es tener un poco de texto y un botón debajo (dentro del LinearLayout
en el nivel 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 que el LinearLayout
contiene el botón se pegue a la parte inferior de la pantalla.
Al principio pensé que no debería publicar el XML completo porque generalmente es un rechazo ver una gran cantidad 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"
en el problemático LinearLayout
, lo que hace que el botón se pegue a la parte inferior de la pantalla sin importar nada. Pero eso también hace que el texto se pegue a la parte inferior de la pantalla, que no es exactamente lo que buscaba.
Actualización: android:layout_gravity="bottom"
eso, android:layout_gravity="bottom"
hace que ScrollView
no pueda, bueno, desplazarse. ¿Otras ideas?
¿Puede proporcionar su diseño xml? Hacerlo permitiría a las personas recrear el problema con un mínimo esfuerzo.
Puede que tengas que configurar
android:layout_weight="1"
para el elemento que desea expandir
En mi caso no he dado la
Orientación de LinearLayout (ScrollView''s Child)
De manera predeterminada, toma horizontal, pero scrollview se desplaza verticalmente, así que compruebe si ''android: orientación = "vertical" está configurado para su ScrollView''s Child (en el caso de LinearLayout).
Este fue mi caso, espero que ayude a alguien.
.
Encontré la solución yo mismo al final. El problema no fue con LinearLayout
, sino con ScrollView
(parece extraño, considerando el hecho de que ScrollView
estaba expandiendo, mientras que LinearLayout
no lo era).
La solución fue usar android:fillViewport="true"
en ScrollView
.
He utilizado dinámicamente para conseguir esto. Tengo un LinearLayout y dentro de este ScrollView utilizado como un niño. Luego tomo de nuevo LinearLayout y agrego lo que View View quiera a este LinearLayout y luego este LinearLayout agrega a ScrollView y finalmente agrega este ScrollView a LinearLayout. Entonces u puede obtener desplazamiento en su ScrollView y no quedará nada visible.
LinearLayout (Parent) - ScrollView (hijo de LinerLayout) - LinearLayout (hijo de ScrollView): agregue aquí textView, Buttons, spinner, etc. lo que desee. Luego agrega este LinearLyout a ScrollView. Bcoz solo aplica un NIÑO para ScrollView y agregue este ScrollView a LinearLyout. Si el área definida se excede del tamaño de la Pantalla, entonces obtendrá un ScrollView dentro de ScrollView.
La solución es utilizar android: fillViewport = "true" en la vista de desplazamiento y, además, intente usar "wrap_content" en lugar de "fill_parent", ya que "fill_parent" está obsoleto a partir de ahora.
Sé que esta publicación es muy antigua, para aquellos que no quieren usar android:fillViewport="true"
porque a veces no aparece el texto de edición sobre el teclado. Use un diseño relativo en lugar de LinearLayout para resolver el propósito.