12

Si verificano problemi con un frammento costituito da una ScrollView contenente un LinearLayout. Sto cercando di creare un effetto in cui LinearLayout ha uno sfondo bianco e sembra un pezzo di carta che scorre su uno sfondo colorato. Il modo in cui sto cercando di ottenere questo risultato è far scorrere ScrollView occupando tutto lo spazio del frammento e quindi il LinearLayout interno ha lo android:layout_margin="16dp" per creare lo spazio attorno alla "carta".ScrollView non scorre fino alla fine del margine inferiore interno di LinearLayout

In questo modo, la barra di scorrimento di ScrollView appare nell'area di sfondo colorata, il margine in alto scorre via insieme al contenuto e il margine in basso scorre solo quando si raggiunge la fine.

Sfortunatamente in questa configurazione ScrollView non scorrerà fino alla fine e in effetti taglia una piccola parte del testo in basso. Sospetto che ScrollView non tenga conto dei margini del suo bambino nella sua distanza di scorrimento verticale. Per risolvere questo problema ho avvolto LinearLayout in un FrameLayout che risolve il problema, ma sembra superfluo. Sarebbe apprezzato qualsiasi suggerimento su come eliminare questo contenitore non necessario.

Nota: l'impostazione di android:padding="16dp" sullo ScrollView e la scomposizione dei margini non ha l'effetto desiderato, poiché il padding appare continuamente su tutti e quattro i bordi, indipendentemente dalla posizione di scorrimento.

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    tools:context=".ArticleFragment" > 

    <!-- This FrameLayout exists purely to force the outer ScrollView to respect 
     the margins of the LinearLayout --> 
    <FrameLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:padding="10dp" 
      android:layout_margin="16dp" 
      android:background="@color/page_background" > 

      <TextView 
       android:id="@+id/article_title" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceLarge" 
       android:textIsSelectable="true" /> 

      <TextView 
       android:id="@+id/article_content" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:textIsSelectable="true" /> 

     </LinearLayout> 
    </FrameLayout> 
</ScrollView> 
+1

provato a installare 'Android: layout_height = "fill_parent"' a 'ScrollView'? –

+0

@AdilSoomro Sì, nessuna gioia. La dimensione di ScrollView non è davvero un problema: riempie lo spazio disponibile in modo appropriato. È l'area di scorrimento che fornisce: non consente lo scorrimento fino alla fine del suo contenuto quando il bambino immediato ha un margine.Credo che il problema sia causato dal fatto che non tiene conto del margine di suo figlio quando calcola l'area di scorrimento. –

risposta

0

avrei sbarazzarsi del FrameLayout e rendere il LinearLayout il figlio del ScrollView con match_parent set come l'altezza di layout. Se ancora non funziona, prendi in considerazione la possibilità di sostituire il margine inferiore con un altro arbitrario View con l'altezza e lo sfondo desiderati come ultimo elemento nello LinearLayout.

+0

Match_parent deve essere in scrollView. E figlio di scrollView deve avere heigh = "wrap_content". –

+0

Ah, buon punto. L'ultima opzione sarebbe probabilmente la migliore allora. – Wenger

+2

Nessuna di queste combinazioni risolve il problema. Aggiungere una vista extra dell'altezza del margine desiderata alla fine del LinearLayout è leggermente più grossolano rispetto al wrapping nel FrameLayout, per essere onesti. Perché ScrollView si comporta in questo modo e ignora i margini superiore e inferiore? –

5

Ricordo di aver avuto problemi con lo ScrollView in qualche modo non arrivare alla fine del suo contenuto quando il layout del contenuto aveva un margine superiore. Ho risolto il problema con un piccolo hack, aggiungendo una vista vuota alla fine del LinearLayout:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    tools:context=".ArticleFragment" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:padding="10dp" 
     android:layout_margin="16dp" > 

     <TextView 
      android:id="@+id/article_title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:textIsSelectable="true" 
      android:background="@color/page_background" /> 

     <TextView 
      android:id="@+id/article_content" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:textIsSelectable="true" 
      android:background="@color/page_background" /> 


     <!-- Add a little space to the end --> 
     <View 
      android:layout_width="fill_parent" 
      android:layout_height="30dp" /> 

    </LinearLayout> 
</ScrollView> 

Ho usato una vista analoga vuoto anche all'inizio della LinearLayout evitare completamente top/margini inferiore.

MODIFICA: Ho appena realizzato che volevi anche la fine del "foglio" da mostrare quando raggiungi la fine della vista. In tal caso, è possibile impostare il colore di sfondo su TextView s anziché sul layout stesso. Quindi assicurati che non ci siano margini tra il titolo e l'articolo (usa il padding come separazione).

EDIT2: Dovrei imparare a controllare quando sono state poste le domande ... Beh, forse questo aiuta ancora qualcuno. :)

1

La domanda è vecchia, ma ho riscontrato problemi con ScrollView che si comporta male durante il wrapping di FrameLayout. Inoltre, non sembra considerare i margini dei layout contenuti. È possibile sostituire FrameLayout con un altro LinearLayout figlio singolo, che dovrebbe misurare correttamente. Avrei tolto il FrameLayout completamente e semplicemente aggiunto margine riassunta con imbottitura sul layout interno:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:padding="26dp" 
      android:background="@color/page_background" > 
<!--...--> 
Problemi correlati