2012-07-26 25 views
26

Tengo un elemento de vista de desplazamiento de raíz con una disposición relativa en él, y un grupo de elementos de formulario dentro del diseño relativo.Android ScrollView se niega a desplazarse al final

Por alguna razón, cuando el teclado suave está activo parece que no puede desplazarse completamente hasta la parte inferior, lo que corta uno de mis botones por la mitad.

Aquí hay una captura de pantalla del visor de jerarquía para demostrar a qué me refiero.

enter image description here

Como se puede ver, el sistema sabe que la visión continúa más allá del teclado, sin embargo, el ScrollView (que llena la parte visible de la pantalla correctamente) no continuará para desplazarse hacia abajo como debería.

Tengo android:windowSoftInputMode="adjustResize" en el manifiesto para la actividad, y puedo/no lo cambiaré a pan.

Cualquier ayuda es apreciada.

editar: Estoy viendo esto en más de 1 vista. Aquí está el código XML de otro punto de vista con el mismo problema:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/background" > 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="32dp" > 
     <EditText 
      android:id="@+id/reset_oldpass" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentRight="true" 
      android:ems="10" 
      android:singleLine="true" 
      android:hint="@string/current_password" 
      android:layout_marginTop="16dp" /> 
     <EditText 
      android:id="@+id/reset_pass1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentRight="true" 
      android:layout_below="@+id/reset_oldpass" 
      android:ems="10" 
      android:hint="@string/reset_new_pass" 
      android:inputType="textPassword" 
      android:layout_marginTop="16dp" /> 
     <EditText 
      android:id="@+id/reset_pass2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentRight="true" 
      android:layout_below="@+id/reset_pass1" 
      android:ems="10" 
      android:hint="@string/reset_confirm_pass" 
      android:inputType="textPassword" 
      android:layout_marginTop="16dp" /> 
     <TextView 
      android:id="@+id/reset_forgot_password" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentRight="true" 
      android:layout_below="@+id/reset_pass2" 
      android:layout_marginTop="16dp" 
      android:textColor="@color/Link" 
      android:textStyle="bold" 
      android:text="@string/Login_forgot_password" /> 
     <Button 
      android:id="@+id/reset_reset_password_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/reset_forgot_password" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="16dp" 
      android:layout_marginBottom="32dp" 
      android:text="@string/reset_change_pass" /> 
    </RelativeLayout> 
</ScrollView> 
+0

Esto también ocurre con 'LinearLayout'. ¡Gracias por proporcionar este hilo! – avalancha

Respuesta

39

Esto es realmente extraño, pero parece que es causada por android:layout_margin="32dp" dentro del RelativeLayout. Una vez que lo saqué, el rollo funcionó correctamente.

Por supuesto, debido a esto tuve que agregar muchos más márgenes a mis elementos de formulario, pero al menos esto ahora está arreglado.

+3

Esto es cierto. Si su diseño dentro de ScrollView tiene márgenes, no podrá desplazarse hasta el final. Para mi caso, podría simplemente poner el margen en el diseño raíz ya que tenía un LinearLayout que contenía una vista de desplazamiento y un botón. – slott

+0

Gracias por su auto-respuesta, ¡me salvó de mucho tiempo! – Apollo

+0

relleno en la vista de desplazamiento evitaría la necesidad de margen cada elemento? – Gulfaran

13

Tuve el mismo problema y lo solucioné al usar relleno en ScrollView en lugar de margen en RelativeLayout.

Así, retire android:layout_margin="32dp" de RelativeLayout (el niño de ScrollView) y añadir a la android:padding="32dp" ScrollView.

+0

Esta fue la solución más adecuada que ir y dividir el margen en los elementos secundarios. El margen solo necesita colocarse en la ubicación adecuada; ScrollView en lugar del elemento de diseño que rodea. –

+0

acaba de decir esto sin notar el comentario o la fecha de esta publicación xD – Gulfaran

+0

En caso de que esto ayude a otra persona, también encontré este error cuando puse el relleno en 'ScrollView'. Lo único que funcionó para mí fue poner relleno en el hijo de 'ScrollView'. –

0

También puede insertar una visión falsa de imitar el margen inferior de esta manera:

<View 
      android:layout_width="match_parent" 
      android:layout_height="20dp" 
      android:layout_below="@id/recompensaLabel" 
      android:layout_marginTop="0dp" 
      android:id="@+id/simulate_bottom_margin_view" 

      /> 

El efecto es el mismo, sólo tiene que introducirlo por debajo del último elemento en su disposición relativa.

0

Acabo de tener este problema con una aplicación y descubrí que se debía a que ScrollView layout_height se configuraba para ajustar el contenido. El problema es que si tiene suficiente contenido para necesitar un ScrollView, no desea envolver el contenido porque la parte inferior del ScrollView está fuera de la pantalla en una cantidad arbitraria. No tenía suficientes datos para ser afectado por esto ya que no necesitaba un ScrollView hasta que apareció el teclado. Por lo que parece, el OP estaba en la misma situación.

Ahora, una vez que aparece el teclado, la parte inferior del ScrollView se levanta la misma cantidad que la altura del teclado y termina debajo de la parte superior del teclado por la misma cantidad arbitraria que estaba debajo de la parte inferior del pantalla visible.

En última instancia, mi solución fue unir la parte superior del ScrollView a mi barra de herramientas y luego hacer clic derecho en ScrollVIew en el árbol y seleccionar 'centrar verticalmente' (no en la opción principal). Ahora funciona como un encanto. El layout_height debería ir automáticamente a 0dp.

0

Haciendo que la barra de estado sea transparente en lollipop y arriba estaba creando el problema para mí. Estableciendo

android:fitsSystemWindows="true"
en la vista principal del diseño que contiene scrollView resolvió el problema.

Cuestiones relacionadas