tidak ada gravitasi untuk scrollview. bagaimana membuat konten di dalam scrollview sebagai pusat

105

Saya ingin konten di dalam scrollView sebagai pusat.

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

Catatan: tidak ada android:gravityatribut untuk scrollvew.

sol apapun: -

Padma Kumar
sumber

Jawaban:

176

Saya memiliki masalah yang sama dan akhirnya menemukan jawabannya. Ini untuk vertikal ScrollView.

Letakkan ScrollViewbagian dalam Anda RelativeLayoutdan pusatkan di RelativeLayout. Agar ini berhasil, Anda ScrollViewharus memilikinya

android:layout_height="wrap_content"

Seperti inilah tampilan kode akhir:

<?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>
hadi
sumber
29
Yang ini tampaknya bekerja lebih baik untuk saya daripada jawaban yang diterima. Terima kasih!
Patrick Boos
Idealnya android harus melihat masalah ini jika ada hierarki tata letak. Juga harus menyediakan kedua opsi pengguliran (horizontal / vertikal) dalam satu tampilan gulir. BTW terima kasih @hadi
mayank_droid
2
Ini sedikit peretasan, jadi meskipun ini berfungsi dengan baik, rasanya salah.
DariusL
3
Hei ini berfungsi, tetapi tidak menggulir ketika keyboard terlihat, saya mencoba menambahkan manifes android:windowSoftInputMode="stateHidden|adjustResize"tetapi, jangan gulir, tolong bantu saya
Helio Soares Junior
3
Tidak perlu menggunakan heavy RelativeLayoutsebagai root view. Ini bisa FrameLayoutdan android:layout_gravity="center_vertical"untukScrollView
GrafOrlov
148

Bagaimana dengan ini?

<?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>
Hantu
sumber
2
Ya! Bagaimana tentang itu! Ini bekerja dengan luar biasa bagi saya, jadi terima kasih banyak, tuan yang baik.
RileyE
Hebat! Ini menyelamatkan saya juga! Terima kasih :)
marienke
101
Ada satu masalah dengan ini. Jika konten Anda di ScrollView lebih besar dari scrollview, itu akan tetap memusatkannya dan memotong konten di bagian atas (meskipun belum yakin mengapa). Artinya Anda tidak dapat menggulir ke sana.
Patrick Boos
7
PatrickBoos benar; ini sepertinya tidak berhasil. Gunakan jawaban hadi di bawah ini, secara vertikal memusatkan tampilan gulir di RelativeLayout.
Mason Lee
Ya, cara ini ada bug, konten lebih besar dari scrollView, konten tidak akan bergulir ke atas, topnya adalah angka negatif, aneh :(
Kross
98

Saya pikir solusi yang lebih elegan akan menggunakan ScrollView's android:fillViewportproperti. A ScrollViewsedikit berbeda dalam cara memperlakukan tampilan kontennya (hanya dapat memiliki satu), bahkan jika Anda menyetel match_parent( fill_parent) ke ScrollViewitu tidak akan memberikan banyak jarak ke tampilan kontennya, sebaliknya perilaku default adalah untuk ScrollViewmembungkus konten apa pun yang Anda tentukan untuk tampilan itu. Apa yang android:fillViewportdilakukan adalah memberi tahu ScrollViewuntuk meregangkan kontennya untuk mengisi viewport ( http://developer.android.com/reference/android/widget/ScrollView.html#attr_android:fillViewport ). Jadi dalam kasus ini, Anda LinearLayoutakan diregangkan agar sesuai dengan viewport dan jika ketinggian berada di belakang viewport maka itu akan dapat digulir sesuai dengan yang Anda inginkan!

Jawaban yang diterima tidak akan berfungsi dengan baik ketika konten melampaui ScrollViewkarena itu masih akan memusatkan tampilan konten terlebih dahulu menyebabkannya memotong sebagian tampilan, dan ScrollViewberpusat di tata letak lain berfungsi tetapi terasa tidak benar, selain itu Saya pikir itu juga akan menghasilkan kesalahan lint (orang tua tidak berguna atau sesuatu di sepanjang garis itu).

Coba sesuatu seperti ini:

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

Ingatlah bahwa alasan itu dipusatkan di sini sekarang adalah karena android:gravitypada LinearLayoutsejak ScrollViewakan meregangkan LinearLayoutjadi ingatlah itu tergantung pada apa yang Anda tambahkan ke tata letak.

Baik lagi membaca ScrollViewmeskipun bukan tentang keterpusatan tapi tentang fillViewportadalah http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/

Brian Ethier
sumber
11
Ini sepertinya implementasi yang paling benar, tidak diperlukan tampilan tambahan.
DariusL
1
Solusi bagus, sepertinya yang terbersih bagi saya. Terima kasih untuk itu
Benjamin Scharbau
2
Berfungsi lebih baik daripada jawaban yang diterima, Anda menghemat banyak waktu! Brian Ethier yang sangat bagus!
Mattia Ruggiero
Ini adalah solusi yang tepat, untuk semua alasan yang dijelaskan di dalamnya .. Jika Anda mencoba solusi di atas, dan tampilan gulir Anda lebih lebar dari layar, Anda memang akan memiliki bagian dari tampilan gulir yang tidak dapat dijangkau dan tidak dapat menggulir ke sana .. Ini harus diterima sebagai solusi yang tepat
Speckpgh
1
Tipikal Stackoverflow .. solusi yang tepat sering kali berada di tengah.
Teovald
14

Gunakan atribut ini di ScrollView

android:fillViewport="true"

Contoh

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

Pastikan untuk menggunakan Single Child di ScrollView seperti contoh di atas yaitu Relativelayout.

Abhishek Garg
sumber
@JoshuaKing mungkin karena ini adalah pertanyaan lama 7 tahun dan saya memposting jawaban ini baru-baru ini 9 bulan yang lalu.
Abhishek Garg
Ha! oh .. benar. πŸ˜†Nah, itu bekerja dengan sempurna! Jadi terima kasih!
Joshua King
1
Ini pasti jawaban yang diterima! Ini berfungsi dengan sempurna dan memusatkan ScrollView jika konten kurang dari ukuran wadah. Bekerja untuk ScrollView dan HorizontalScrollView. Terima kasih banyak! πŸ’πŸ’–
Ray Li
ini dapat memiliki efek yang tidak diinginkan dari peregangan konten Anda di dalam tampilan gulir
martinseal1987
@ martinseal1987 saya pikir efeknya akan tergantung pada komponen anak Anda, yaitu bagaimana Anda membuat desain tata letak Anda, meskipun jika ini tidak berhasil untuk Anda, Anda dapat membuat komponen tampilan gulir kustom Anda sendiri sesuai dengan desain dan kebutuhan pekerjaan Anda. dan tolong juga bagikan tangkapan layar hasil yang Anda inginkan dengan saya, sehingga saya dapat melihat dan dapat memberikan solusi yang lebih baik dan berfungsi. siap untuk membantu. Bersulang.
Abhishek Garg
9

Untuk @Patrick_Boss - yang menghentikan pemotongan konten dalam aplikasi saya adalah mengubah gravitasi dan layout_gravity menjadi center_horizontal untuk LinearLayout.

Ini berhasil untuk saya ... tetapi tidak yakin apakah itu akan berhasil untuk Anda.

Modifikasi jawaban @ 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>
ProgDevCode
sumber
1
Ini memecahkan masalah pemotongan bagian atas. Namun masih ada satu masalah dengan solusi ini. Konten ScrollView tidak berada di tengah secara vertikal. Tapi ini bisa diperbaiki dengan menyetel nilai-nilai ScrollView berikut: android: layout_height = "wrap_content" android: layout_gravity = "center_vertical"
Patrick Boos
Saya telah menemukan bahwa agar ini berfungsi dalam tata letak lain, ScrollView atas harus disematkan dalam FrameLayout.
Theo
1

Satu hal yang perlu diperhatikan adalah apa yang TIDAK disetel . Pastikan kontrol anak Anda, terutama EditTextkontrol, tidak memilikiRequestFocus set properti.

Ini mungkin salah satu properti yang terakhir ditafsirkan pada tata letak dan akan menggantikan pengaturan gravitasi pada induknya ( layoutatau ScrollView).

Epsilon3
sumber
0

menggunakan tampilan gulir di dalam ConstraintLayout. Ini berhasil untuk saya

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

Tinggi tampilan gulir harus wrap_content

<ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
Hariharan Kanakaraja
sumber