nessuna gravità per scrollview. come rendere il contenuto all'interno di scrollview come centro


105

Voglio il contenuto all'interno di scrollView come centro.

<ScrollView
    android:id="@+id/scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay"
    android:layout_gravity="center" >

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="check" 
        android:gravity="center_vertical|center_horizontal"/>

</ScrollView>

Nota: non esiste alcun android:gravityattributo per scrollvew.

qualsiasi sol: -

Risposte:


176

Ho avuto lo stesso problema e finalmente l'ho capito. Questo è per una verticale ScrollView.

Metti il ​​tuo ScrollViewinterno a RelativeLayoute centralo in RelativeLayout. Affinché funzioni, ScrollViewdovresti avere

android:layout_height="wrap_content"

Ecco come dovrebbe apparire il codice finale:

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

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_centerVertical="true" >

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b1"/>
            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b2"/>
            <Button
                android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b3"/>
        </LinearLayout>

    </ScrollView>

</RelativeLayout>

29
Questo sembra funzionare meglio per me rispetto alla risposta accettata. Grazie!
Patrick Boos

Idealmente, Android dovrebbe esaminare questi problemi quando esiste una gerarchia di layout. Inoltre dovrebbe fornire entrambe le opzioni di scorrimento (orizzontale / verticale) in una visualizzazione a scorrimento.BTW ringrazia @hadi
mayank_droid

2
Questo è un po 'un trucco, quindi mentre funziona bene sembra sbagliato.
DariusL

3
Ehi, funziona, ma non scorre quando la tastiera è visibile, ho provato ad aggiungere nel manifest android:windowSoftInputMode="stateHidden|adjustResize"ma, non scorrere, aiutami per favore
Helio Soares Junior

3
Non c'è bisogno di usare pesante RelativeLayoutcome vista root. Può essere FrameLayoute android:layout_gravity="center_vertical"perScrollView
GrafOrlov

148

Cosa ne pensi di questo?

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay" >


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:layout_gravity="center"
        android:gravity="center">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" 
            android:gravity="center_vertical|center_horizontal"/>
    </LinearLayout>

</ScrollView>

2
Si! Che ne dici di quello! Questo ha funzionato in modo fantastico per me, quindi grazie mille, gentile signore.
RileyE

Eccezionale! Anche questo mi ha salvato! Grazie :)
marienke

101
C'è un problema con questo. Se il contenuto in ScrollView è più grande della scrollview, lo centrerà comunque e taglierà il contenuto in alto (non sono ancora sicuro del perché). Significa che non puoi scorrere lì.
Patrick Boos

7
PatrickBoos ha ragione; questo non sembra funzionare. Usa la risposta di hadi di seguito, centrando verticalmente la visualizzazione a scorrimento in un RelativeLayout.
Mason Lee

Sì, in questo modo hanno bug, contenuti più grandi di scrollView, il contenuto non scorrerà verso l'alto, il suo numero superiore è negativo, strano :(
Kross

98

Credo che una soluzione più elegante sarebbe quella di utilizzare il ScrollView's android:fillViewportproprietà. A ScrollViewè leggermente diverso nel modo in cui tratta la sua visualizzazione del contenuto (può averne solo una), anche se si imposta match_parent( fill_parent) su ScrollViewnon darà molta spaziatura alla sua visualizzazione del contenuto, invece il comportamento predefinito è per ScrollViewavvolgere il contenuto indipendentemente da ciò che specifichi per quella vista. Quello che android:fillViewportfa è dire ScrollViewa di estendere il suo contenuto per riempire il viewport ( http://developer.android.com/reference/android/widget/ScrollView.html#attr_android:fillViewport ). Quindi, in questo caso, LinearLayoutverrebbe allungato per adattarsi al viewport e se l'altezza va dietro al viewport allora sarà scorrevole, che è esattamente quello che vuoi!

La risposta accettata non funzionerà correttamente quando il contenuto si estende oltre il ScrollViewperché centrerà ancora la visualizzazione del contenuto prima causando il taglio di una parte della visualizzazione e il ScrollViewcentrato in un altro layout funziona ma non sembra giusto, inoltre Penso che risulterà anche in un errore di lanugine (genitore inutile o qualcosa del genere).

Prova qualcosa di simile:

<ScrollView
    android:id="@+id/scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay"
    android:fillViewport="true">

    <LinearLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" />

    </LinearLayout>

</ScrollView>

Ricorda solo che il motivo per cui viene centrato qui ora è a causa del android:gravitysu LinearLayoutpoiché ScrollViewallungherà il, LinearLayoutquindi tienilo a mente a seconda di ciò che aggiungi al layout.

Un'altra buona lettura ScrollViewanche se non sul centraggio ma su fillViewportè http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/


11
Sembra l'implementazione più corretta, non sono richieste visualizzazioni aggiuntive.
DariusL

1
Bella soluzione, sembra essere la più pulita per me. Grazie per questo
Benjamin Scharbau

2
Funziona meglio della risposta accettata, mi hai fatto risparmiare un sacco di tempo! Davvero bravo Brian Ethier!
Mattia Ruggiero

Questa è la soluzione corretta, per tutti i motivi descritti in essa .. Se provi la soluzione sopra e la tua visualizzazione di scorrimento è più ampia dello schermo, avrai effettivamente una parte della visualizzazione di scorrimento irraggiungibile e non potrai scorrere fino ad essa .. Questo dovrebbe essere accettato come la soluzione adeguata
Speckpgh

1
Stackoverflow tipico ... la soluzione corretta è spesso da qualche parte nel mezzo.
Teovald

14

Usa questo attributo in ScrollView

android:fillViewport="true"

Esempio

 <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarStyle="outsideOverlay"
android:fillViewport="true"
>
   <RelativeLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content">

         <!--Your Code goes here-->

   </RelativeLayout>

</ScrollView>

Assicurati di utilizzare Single Child in ScrollView proprio come nell'esempio precedente che è Relativelayout.


@JoshuaKing può perché è una domanda vecchia di 7 anni e ho pubblicato questa risposta di recente 9 mesi fa.
Abhishek Garg

Ha! oh .. verità. 😆Beh, ha funzionato perfettamente! Quindi grazie!
Joshua King

1
Questa dovrebbe essere sicuramente la risposta accettata! Funziona perfettamente e centra una ScrollView se il contenuto è inferiore alla dimensione del contenitore. Funziona sia per ScrollView che per HorizontalScrollView. Grazie mille! 💝💖
Ray Li

questo può avere l'effetto indesiderato di allungare il contenuto all'interno della visualizzazione a scorrimento
martinseal1987,

@ martinseal1987 Penso che l'effetto dipenderà dal componente figlio, dal modo in cui crei il design del layout, anche se se questo non funziona per te, puoi creare il tuo componente di visualizzazione a scorrimento personalizzato secondo le tue esigenze di progettazione e lavoro. e per favore condividi anche con me lo screenshot del risultato desiderato, così posso esaminare e fornire la tua soluzione migliore e funzionante. pronto ad aiutare. Saluti.
Abhishek Garg

9

Per @Patrick_Boss, ciò che ha impedito il taglio del contenuto nella mia applicazione è stato modificare la gravità e layout_gravity in center_horizontal per LinearLayout.

Ha funzionato per me ... ma non sono sicuro che funzionerà per te.

Modifica della risposta di @ Ghost -

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay" >


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" 
            android:gravity="center_vertical|center_horizontal"/>
    </LinearLayout>

</ScrollView>

1
Questo risolve il problema del taglio della parte superiore. Ma c'è ancora un problema con questa soluzione. Il contenuto ScrollView non è stato centrato verticalmente. Ma questo può essere risolto impostando i seguenti valori di ScrollView: android: layout_height = "wrap_content" android: layout_gravity = "center_vertical"
Patrick Boos

Ho scoperto che affinché funzioni all'interno di altri layout, lo ScrollView superiore deve essere incorporato in un FrameLayout.
Theo

1

Una cosa da considerare è cosa NON impostare . Assicurati che i controlli figlio, in particolare i EditTextcontrolli, non abbiano la RequestFocusproprietà impostata.

Questa potrebbe essere una delle ultime proprietà interpretate sul layout e sovrascriverà le impostazioni di gravità sui suoi genitori ( layouto ScrollView).


0

utilizzando la visualizzazione a scorrimento all'interno di ConstraintLayout. Ha funzionato per me

<androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white">

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" />
            </ScrollView>
        </androidx.constraintlayout.widget.ConstraintLayout>

L'altezza della visualizzazione di scorrimento deve essere wrap_content

<ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.