ScrollView no se desplaza hasta el final del margen inferior del LinearLayout interno

Tengo problemas con un fragmento que consiste en un ScrollView que contiene un LinearLayout. Estoy tratando de crear un efecto donde el LinearLayout tiene un fondo blanco y parece un trozo de papel en un fondo de color. La forma en que estoy tratando de lograr esto es por tener el ScrollView ocupar el espacio completo del fragmento y luego el LinearLayout dentro tiene android:layout_margin="16dp" para crear el espacio alrededor del "papel".

De esta manera, la barra de desplazamiento de ScrollView aparece en el área de fondo de color, el margen en la parte superior se desplaza junto con el contenido y el margen en la parte inferior sólo se desplaza cuando se llega al final.

Desafortunadamente en esta configuración ScrollView no se desplaza hasta el final y de hecho corta una cantidad muy pequeña del texto en la parte inferior. Sospecho que el ScrollView no está teniendo en cuenta los márgenes de su hijo en su distancia de desplazamiento vertical. Para resolver esto he envuelto el LinearLayout en un FrameLayout que resuelve el problema, pero parece superfluo. Cualquier sugerencia sobre cómo eliminar este recipiente innecesario sería apreciada.

Nota: la configuración de android:padding="16dp" en ScrollView y la eliminación de los márgenes no tiene el efecto deseado, ya que entonces el relleno aparece en los cuatro bordes continuamente, independientemente de la posición de desplazamiento.

 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="wrap_content" tools:context=".ArticleFragment" > <!-- This FrameLayout exists purely to force the outer ScrollView to respect the margins of the LinearLayout --> <FrameLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="10dp" android:layout_margin="16dp" android:background="@color/page_background" > <TextView android:id="@+id/article_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:textIsSelectable="true" /> <TextView android:id="@+id/article_content" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textIsSelectable="true" /> </LinearLayout> </FrameLayout> </ScrollView> 

Recuerdo haber tenido problemas con el ScrollView alguna manera no llegar al final de su contenido cuando el diseño del contenido tenía un margen superior. Resolví el problema con un pequeño hack, agregando una vista vacía al final del LinearLayout :

 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:context=".ArticleFragment" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="10dp" android:layout_margin="16dp" > <TextView android:id="@+id/article_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:textIsSelectable="true" android:background="@color/page_background" /> <TextView android:id="@+id/article_content" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textIsSelectable="true" android:background="@color/page_background" /> <!-- Add a little space to the end --> <View android:layout_width="fill_parent" android:layout_height="30dp" /> </LinearLayout> </ScrollView> 

Utilicé una vista vacía similar también en el principio del LinearLayout para evitar márgenes superiores / inferiores completamente.

EDIT: Acabo de darme cuenta de que también quería que el final del "papel" aparezca al llegar al final de la vista. En ese caso, puede que desee establecer el color de fondo en el TextView s en lugar del diseño en sí. A continuación, asegúrese de que no hay margen entre el título y el artículo (uso de relleno como separación).

EDIT2: Debo aprender a comprobar cuando se hicieron las preguntas … Bueno, tal vez esto todavía ayuda a alguien. 🙂

La pregunta es vieja, pero he tenido problemas con ScrollView que se comportó mal al envolver FrameLayout. También no parece considerar los márgenes de las disposiciones contenidas. Puede reemplazar FrameLayout por otro LinearLayout de un solo hijo, que debe medir correctamente. Me gustaría haber eliminado el FrameLayout completamente y simplemente agregó el margen sumado con relleno en el diseño interior:

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="26dp" android:background="@color/page_background" > <!--...--> 

Me deshaceré de FrameLayout y haré que LinearLayout el hijo del ScrollView con match_parent como la altura del diseño. Si todavía no funciona, considere la posibilidad de reemplazar el margen inferior por otra View arbitraria con la altura y el fondo deseados como el último elemento en LinearLayout .

  • Admob AdView que hace que ScrollView se desplace cuando se muestra
  • Datos de carga de Firebase dinámicamente en desplazamiento
  • Cambiar ScrollView scrollBarStyle mediante programación en Android
  • ScrollView no muestra su contenido correctamente en versiones inferiores de android
  • Cómo configurar la posición inicial de un ScrollView?
  • Detectar desplazamiento con onTouchListener en ScrollView
  • Scrollable EditText dentro de ScrollView
  • ¿Cómo puedo hacer que mi diseño se mueva horizontal y verticalmente?
  • Recyclerview Cambio de elementos durante el desplazamiento
  • Detectar final de ScrollView
  • Cambiar el color de ScrollView mediante programación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.