2011-09-24 11 views
22

Necesito tener un LinearLayout dentro de un SrollView y que LinearLayout debe tener un margen de la ScrollView. Al principio, la única forma en que podía pensar para resolver ese problema era teniendo un LinearLayout dentro de otro LinearLayout con los márgenes establecidos en este último diseño. Ellos no funcionarían si se encuentra en el exterior LinearLayout.Tratar de entender los márgenes en el interior de un LinearLayout ScrollView

Ejemplo:

<?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="fill_parent" 
    android:orientation="vertical" 
    android:fillViewport="true" 
    android:background="@color/layout_color_green"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:background="@color/layout_color_yellow"> 
     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_margin="10dp" 
      android:orientation="vertical" 
      android:background="@color/layout_color_blue"> 
     </LinearLayout> 
    </LinearLayout> 
</ScrollView> 

enter image description here

Mi pregunta es: ¿Por qué necesito hacer esto?

Si tuviera sólo una LinearLayout no habría márgenes ...

Ejemplo:

<?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="fill_parent" 
    android:orientation="vertical" 
    android:fillViewport="true" 
    android:background="@color/layout_color_green"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_margin="10dp" 
     android:orientation="vertical" 
     android:background="@color/layout_color_blue"> 
    </LinearLayout> 
</ScrollView> 

enter image description here

Luego, en busca de algún problema similar, me encontré con unos diseños lo que me dio la idea de usar relleno en el ScrollView en lugar de margen en el LinearLayout. Esto también resuelve mi problema y no necesito un LinearLayout dentro de otro. Es una solución más elegante.

Aún así, me gustaría entender por qué el margen simple dentro del LinearLayout no funciona cuando está dentro de un ScrollView. Porque funciona bien si no está dentro de un ScrollView.

¿Alguien sabe por qué?

Respuesta

16

me hicieron pozos un poco en el código fuente:

ScrollView extiende FrameLayout. Este tiene algunos problemas de margen y ScrollView ni siquiera intenta resolver eso. Los márgenes son básicamente ignorados mientras se mide.

Pero al final no importa ya que deberías poder definir un relleno en el ScrollView (es una afirmación, no lo intenté). No debería haber necesidad de margen para una vista infantil única.

+1

Pero la cosa es que los márgenes no son el único problema.Si tengo la altura 'LinearLayout' establecida en' wrap_content' y toda la altura de los niños configurada en 'match_parent', los niños de hecho serán' fill_parent', que es el valor que proviene de 'ScrollView'. Y no 'wrap_content', que es el valor de' LinearLayout', su padre directo. Este problema tampoco ocurre si uso un 'LinearLayout' dentro de otro. ¿Entonces supongo que hay más 'ScrollView' de lo que sabemos? –

+0

Sí, por supuesto. Forzaste ese comportamiento con 'android: fillViewport =" true "'. – Knickedi

+0

Entonces, ¿me recomiendan ir con el relleno en lugar del margen y configurar todos los elementos secundarios del 'LinearLayout' en' wrap_content'? –

11

Hola Knickedi y Ricardo Amaral,

Aunque esta respuesta se marca como resuelto, pero quiero poner algunas luces sobre el tema.

Como dijo Knickedi, ScrollView extiende FrameLayout.

Así que mi respuesta es que puede configurar el layout_gravity de LinearLayout dentro de scrollView y luego layout_margin funcionará en LinearLayout como caso con linearLayout dentro de FrameLayout.

Tuve el mismo problema y lo he aplicado y funcionó para mí. :)

Ejemplo:

<ScrollView 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 

       <LinearLayout 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="top" 
        android:layout_marginTop="30dp" 
        android:orientation="vertical" > 
</ScrollView> 
+2

esta debería ser la respuesta aceptada. El problema resuelto – deej

+1

Eso debería ser t él aceptó la respuesta. –

Cuestiones relacionadas