2011-09-24 17 views
22

È necessario disporre di LinearLayout all'interno di SrollView e che LinearLayout deve avere un margine da ScrollView. All'inizio, l'unico modo in cui potevo pensare di risolvere quel problema era avere un LinearLayout all'interno di un altro LinearLayout con i margini impostati su quest'ultimo layout. Essi non avrebbero funzionato se fossero impostati nel esterna LinearLayout.Tentativo di comprendere i margini in LinearLayout all'interno di ScrollView

Esempio:

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

la mia domanda è: Perché ho bisogno di fare questo?

Se ho avuto solo un LinearLayout non ci sarebbero margini ...

Esempio:

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

Poi, alla ricerca di qualche problema analogo, ho trovato un paio di layout che mi ha dato l'idea di utilizzare il padding nello ScrollView invece del margine nello LinearLayout. Questo risolve anche il mio problema e non ho bisogno di un LinearLayout all'interno di un altro. È una soluzione più elegante.

Ancora, mi piacerebbe capire perché il semplice margine all'interno del LinearLayout non funziona quando all'interno di un ScrollView. Perché funziona bene se non è all'interno di un ScrollView.

Qualcuno sa perché?

risposta

16

ho scavato una po 'nel codice sorgente:

ScrollView estende FrameLayout. Questo ha alcuni problemi di margine se stesso e ScrollView non sta nemmeno cercando di risolverlo. I margini sono fondamentalmente ignorati durante il measuaring.

Ma alla fine non ha importanza dal momento che dovresti essere in grado di definire un riempimento sullo stesso ScrollView (è un'affermazione, non l'ho provato). Non ci dovrebbe essere bisogno di margini per una vista figlio unico.

+1

Ma il fatto è che i margini non sono l'unico problema.Se ho l'altezza 'LinearLayout' impostata su' wrap_content' e l'altezza di tutti i bambini è impostata su 'match_parent', i bambini saranno di fatto' fill_parent', che è il valore che deriva da 'ScrollView'. E non 'wrap_content' che è il valore di' LinearLayout', il loro genitore diretto. Anche questo problema non si verifica se uso uno 'LinearLayout' all'interno di un altro. Quindi immagino ci sia di più nel 'ScrollView' di quanto sappiamo !? –

+0

Sì, certo. Hai forzato quel comportamento con 'android: fillViewport =" true "'. – Knickedi

+0

Quindi, mi consiglia di andare con il padding al posto del margine e impostare tutti i child di 'LinearLayout' su' wrap_content'? –

11

Ciao Knickedi e Ricardo Amaral,

Anche se questa risposta è contrassegnato come risolto, ma voglio mettere alcune luci sulla questione.

Come detto da Knickedi, ScrollView estende FrameLayout.

Quindi la mia risposta è che è possibile impostare layout_gravity di LinearLayout all'interno di scrollView e quindi layout_margin funzionerà in LinearLayout come caso con linearLayout all'interno di FrameLayout.

Ho avuto lo stesso problema e ho applicato questo e ha funzionato per me. :)

Esempio:

<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

questa dovrebbe essere la risposta accettata. il problema risolto – deej

+1

che dovrebbe essere t ha accettato la risposta. –

Problemi correlati