Cercando di capire i margini di LinearLayout all’interno di una ScrollView

Ho bisogno di avere un LinearLayout all’interno di un SrollView e che LinearLayout deve avere un margine di dal ScrollView. In un primo momento, l’unico modo che ho potuto pensare di risolvere il problema è stato avere un LinearLayout all’interno di un altro LinearLayout con i margini impostati su quest’ultimo formato. Essi non funzionano se sono stati impostati in esterno LinearLayout.

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>

Cercando di capire i margini di LinearLayout all'interno di una ScrollView

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

Se ho avuto solo uno 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>

Cercando di capire i margini di LinearLayout all'interno di una ScrollView

Quindi, alla ricerca di qualche problema simile, ho trovato un paio di layout che mi ha dato l’idea di utilizzare imbottitura in ScrollView invece di margine in LinearLayout. Questo risolve anche un problema mio e non ho bisogno di un LinearLayout all’interno di un altro. È una soluzione più elegante.

Ancora, vorrei capire perché il margine semplice all’interno del LinearLayout non funziona quando all’interno di una ScrollView. Perché funziona bene se non all’interno di un ScrollView.

Qualcuno sa perché?



2 Replies
  1. 16

    Ho scavato un po ‘ nel codice sorgente:

    ScrollView si estende FrameLayout. Questo ha un po ‘ di margine problemi sé e ScrollView non è nemmeno cercando di risolvere. I margini sono sostanzialmente ignorati measuaring.

    Ma alla fine non importa quanto si dovrebbe essere in grado di definire una imbottitura sul ScrollView stesso (è un’affermazione, non provare che). Non ci dovrebbe essere bisogno di un margine di un solo bambino vista.

    • Ma il fatto è che i margini non sono l’unico problema. Se ho la LinearLayout altezza impostata wrap_content e tutti i bambini di altezza impostata match_parent, i bambini potranno infatti essere fill_parent, che è il valore che viene dal ScrollView. E non wrap_content che è il valore della LinearLayout, la loro diretta genitore. Anche questo problema non accade se uso uno LinearLayout all’interno di un altro. Credo quindi che c’è di più ScrollView che sappiamo!?
    • Sì, naturalmente. È costretto comportamento con android:fillViewport="true".
    • Quindi, non mi consiglia di andare con l’imbottitura invece del margine e impostare tutti i bambini del LinearLayout per wrap_content?
    • Non posso raccomandare imbottitura in quanto questa è l’unica scelta 😉android:fillViewport="false" sarà non forza il LinearLayout essere fill_parent, che è. Quindi non dovrebbe essere allungate e così i bambini non né.
    • Io non sono sicuro di cosa fare, perché questo è parte di un problema più grande dove ho un GridView all’interno di un LinearLayout che è all’interno di un ScrollView. E dopo la ricerca e la lettura di un sacco, l’ho appena scoperto, non dovrei avere un GridView all’interno di un ScrollView. Non ho idea di come fare la mia interfaccia utente ora… 🙁
    • Ok, mi fermo, dopo questo commento dato che questa non è la domanda iniziale più. Ma rispondo ugualmente: è lo stesso motivo per cui non uso un ListView in un ScrollView. 1. Essi non possono mai essere wrap_content in altezza. 2. Sono già scorrevoli, non ha senso metterli in un ScrollView che è anche in verticale scorrevole.
    • È davvero l’unico modo per aggiungere i margini all’interno della scrollview, è davvero anoing devi hack come questo.
    • L’unico problema è, l’aggiunta di imbottitura per la ScrollView farà la scollbar sporga dal bordo dello schermo, e sarà anche brutto come il contenuto apparirà a scorrere oltre la parte superiore e inferiore in nulla. Difficile da spiegare, tramite sms. Provate anche voi a vedere.

  2. 11

    Ciao Knickedi e Ricardo Amaral,

    Se questa risposta è segnato come risolto, ma voglio mettere alcune luci sul problema.

    Come Knickedi detto, ScrollView si estende FrameLayout.

    Quindi la Mia risposta è che Si può impostare il layout_gravity di LinearLayout entro scrollView e poi layout_margin funzionerà in LinearLayout come caso con linearLayout entro 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>
    • questo dovrebbe essere accettato risposta. il problema è risolto
    • Che dovrebbe essere accettato risposta.

Lascia un commento