2011-09-24 1 views
22

je dois avoir un LinearLayout dans un SrollView et que LinearLayout doit avoir une marge de la ScrollView. Au début, la seule façon dont je pouvais penser à résoudre ce problème était d'avoir un LinearLayout dans un autre LinearLayout avec les marges définies sur cette dernière mise en page. Ils ne fonctionnent pas si elles ont été fixées dans la partie extérieure LinearLayout.Essayer de comprendre les marges à l'intérieur d'un LinearLayout ScrollView

Exemple:

<?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

Ma question est: Pourquoi dois-je faire?

Si je n'avais qu'un seul LinearLayout il n'y aurait pas de marge ...

Exemple:

<?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

Ensuite, la recherche d'une question similaire, je trouve quelques mises en page ce qui m'a donné l'idée d'utiliser le remplissage dans le ScrollView au lieu de la marge dans le LinearLayout. Cela résout aussi mon problème et je n'ai pas besoin d'un LinearLayout dans un autre. C'est une solution plus élégante.

Encore, je voudrais comprendre pourquoi la marge simple à l'intérieur du LinearLayout ne fonctionne pas à l'intérieur d'un ScrollView. Parce que cela fonctionne bien si ce n'est pas à l'intérieur d'un ScrollView.

Quelqu'un sait pourquoi?

Répondre

16

Je creusa un peu dans le code source:

ScrollView étend FrameLayout. Celui-ci a des problèmes de marge lui-même et ScrollView n'essaie même pas de résoudre cela. Les marges sont fondamentalement ignorées lors de la mesure.

Mais à la fin ce n'est pas grave puisque vous devriez pouvoir définir un remplissage sur le ScrollView lui-même (c'est une affirmation, n'a pas essayé cela). Il ne devrait pas y avoir besoin de marge pour une vue enfant unique.

+1

Mais la chose est que les marges ne sont pas le seul problème.Si j'ai la hauteur 'LinearLayout' définie sur' wrap_content' et que tous les enfants ont la hauteur 'match_parent', les enfants seront en fait 'fill_parent', qui est la valeur qui vient de' ScrollView'. Et pas 'wrap_content' qui est la valeur de' LinearLayout', leur parent direct. Ce problème ne se produit pas non plus si j'utilise un LinearLayout dans un autre. Donc je suppose qu'il y a plus de 'ScrollView' que nous ne le savons! –

+0

Oui bien sûr. Vous avez forcé ce comportement avec 'android: fillViewport =" true "'. – Knickedi

+0

Alors, recommandez-vous que je pars avec le remplissage au lieu de la marge et que tous les enfants de 'LinearLayout' soient' wrap_content'? –

11

Bonjour Knickedi et Ricardo Amaral,

Bien que cette réponse est marqué comme résolu mais je veux mettre des lumières sur la question. Comme Knickedi l'a dit, ScrollView étend FrameLayout.

Donc, ma réponse est que vous pouvez définir le layout_gravity de LinearLayout dans scrollView, puis layout_margin fonctionnera dans LinearLayout comme cas avec linearLayout dans FrameLayout.

J'ai eu le même problème et j'ai appliqué ceci et cela a fonctionné pour moi. :)

Exemple:

<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

cela devrait être la réponse acceptée.le problème résolu – deej

+1

Cela devrait être t il a accepté la réponse. –

Questions connexes