scrollview için yerçekimi yok. kaydırma görünümünde merkez olarak içerik nasıl yapılır


105

ScrollView içindeki içeriğin merkez olmasını istiyorum.

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

Not:android:gravity scrollvew için bir özellik yoktur .

herhangi bir sol: -

Yanıtlar:


176

Aynı sorunu yaşadım ve sonunda anladım. Bu bir dikey içindir ScrollView.

İçinize ScrollViewbir koyun RelativeLayoutve RelativeLayout. Bunun işe yaraması için ScrollViewsahip olmanız gerekir

android:layout_height="wrap_content"

Nihai kod şu şekilde görünmelidir:

<?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
Bu benim için kabul edilen cevaptan daha iyi çalışıyor gibi görünüyor. Teşekkür ederim!
Patrick Boos

İdeal olarak android, bir düzen hiyerarşisi olduğunda bu sorunlara bakmalıdır. Ayrıca her iki kaydırma (yatay / dikey) seçenekleri sunmak gereken bir scrollview.BTW teşekkür @hadi
mayank_droid

2
Bu biraz hileli, bu yüzden bu iyi çalışsa da yanlış geliyor .
dariusL

3
Hey, çalışıyor, ancak klavye göründüğünde android:windowSoftInputMode="stateHidden|adjustResize"kaydırılmıyor, manifest eklemeyi denedim ama kaydırmayın, lütfen bana yardım edin
Helio Soares Junior

3
RelativeLayoutKök görünümü olarak ağır kullanmaya gerek yok . Olabilir FrameLayoutve android:layout_gravity="center_vertical"içinScrollView
GrafOrlov

148

Buna ne dersin?

<?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
Evet! Peki ya bu! Bu benim için fevkalade çalıştı, bu yüzden çok teşekkür ederim, nazik efendim.
RileyE

Harika! Bu beni de kurtardı! Teşekkürler :)
marienke

101
Bununla ilgili bir sorun var. ScrollView'daki içeriğiniz kaydırma görünümünden daha büyükse, yine de onu ortalayacak ve içeriği en üstte kesecektir (yine de neden olduğundan emin değilim). Yani oraya gidemezsin.
Patrick Boos

7
PatrickBoos haklı; bu işe yaramıyor gibi görünüyor. Aşağıdaki hadi'nin cevabını kullanın, kaydırma görünümünü RelativeLayout'ta dikey olarak ortalayın.
Mason Lee

Evet, bu şekilde hata var, içerik scrollView'dan daha büyük, içerik üste kaydırılmayacak, üst kısmı negatif sayı, garip :(
Kross

98

Bence daha şık bir çözüm, ScrollView'nın android:fillViewportmülkünü kullanmak olacaktır . Bir ScrollViewayarladığınız olsa bile, bu 's içerik görünümü (sadece birine sahip olabilir) nasıl davrandığı biraz farklıdır match_parent( fill_parent) için ScrollViewiçeriğin manzara için o yerine varsayılan davranıştır, o kadar aralık vermeyecektir ScrollViewsarmak için o görünüm için ne belirttiğinizden bağımsız olarak içerik. Ne android:fillViewportyapar söylemek ScrollView(görünüm doldurmak için içeriğini germek için http://developer.android.com/reference/android/widget/ScrollView.html#attr_android:fillViewport ). Yani bu durumda, LinearLayoutgörüntü alanına uyacak şekilde uzatılırsınız ve eğer yükseklik görüntü alanının arkasına giderse, kaydırılabilir olacaktır ki bu tam olarak istediğiniz şeydir!

Kabul edilen yanıt, içerik, 'nin ötesine geçtiğinde düzgün çalışmayacaktır, ScrollViewçünkü ilk önce içerik görünümünü ScrollViewortalayarak görünümün bir bölümünü kesmesine neden olur ve başka bir düzende ortalanmış çalışır, ancak doğru gelmez. Bunun aynı zamanda tüy bırakmayan bir hatayla sonuçlanacağını düşünüyorum (işe yaramaz ebeveyn veya bu çizgiler boyunca bir şey).

Bunun gibi bir şey dene:

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

Sadece şimdi burada merkezli ediliyor sebebi ait olduğunu unutmayın android:gravityüzerinde LinearLayoutberi ScrollViewuzanacaktır LinearLayoutböylece akılda Eğer düzenine eklemek şeye bağlı tutmak.

Başka iyi okumaya ScrollViewolmasa ortalama yaklaşık ama yaklaşık fillViewportbir http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/


11
Bu, en doğru uygulama gibi görünüyor, ekstra görünüm gerekmez.
dariusL

1
Güzel çözüm, benim için en temiz çözüm gibi görünüyor. Teşekkürler
Benjamin Scharbau

2
Kabul edilen cevaptan daha iyi çalışıyor, bana çok zaman kazandırdın! Gerçekten aferin Brian Ethier!
Mattia Ruggiero

İçinde açıklanan tüm nedenlerden ötürü bu doğru çözümdür .. Yukarıdaki çözümü denerseniz ve kaydırma görünümünüz ekranınızdan daha genişse, kaydırma görünümünüzün bir kısmına ulaşılamaz ve kaydırılamaz. . Bu, doğru çözüm olarak kabul edilmelidir
Speckpgh

1
Tipik Stackoverflow .. doğru çözüm genellikle ortada bir yerdedir.
Teovald

14

Bu özelliği ScrollView'da kullanın

android:fillViewport="true"

Misal

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

Relativelayout olan yukarıdaki örnekte olduğu gibi ScrollView'da Tek Çocuk kullandığınızdan emin olun.


@JoshuaKing 7 yaşında bir soru olduğu için olabilir ve bu cevabı geçenlerde 9 ay önce gönderdim.
Abhishek Garg

Ha! oh .. gerçek. 😆Evet, mükemmel çalıştı! Çok teşekkürler!
Joshua King

1
Bu kesinlikle kabul edilen cevap olmalı! Mükemmel çalışır ve içerik kap boyutundan küçükse bir ScrollView ortalar. Hem ScrollView hem de HorizontalScrollView için çalışır. Çok teşekkür ederim! 💝💖
Ray Li

bu, içeriğinizi kaydırma görünümünün içinde istenmeyen şekilde genişletme etkisine sahip olabilir
martinseal1987

@ martinseal1987 Bence efekt, alt bileşeninize, düzen tasarımınızı nasıl yapacağınıza bağlı olacaktır, ancak bu sizin için işe yaramazsa, tasarımınıza ve çalışma ihtiyaçlarınıza göre kendi özel kaydırma görünümü bileşeninizi oluşturabilirsiniz. ve lütfen istediğiniz sonuç ekran görüntüsünü benimle paylaşın, böylece daha iyi ve çalışan bir çözüm arayabilir ve sağlayabilirim. yardıma hazır. şerefe.
Abhishek Garg

9

@Patrick_Boss için - uygulamamda içeriğin kesilmesini engelleyen şey, LinearLayout için yerçekimini ve layout_gravity'yi center_horizontal olarak değiştirmekti.

Benim için çalıştı ... ama senin için işe yarayıp yaramayacağından emin değilim.

@ Ghost'un cevabının değiştirilmesi -

<?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
Bu üst kesimi kesme problemini çözer. Ancak bu çözümle ilgili hala bir sorun var. ScrollView içeriği dikey olarak ortalanmadı. Ancak bu, ScrollView'ın aşağıdaki değerleri ayarlanarak düzeltilebilir: android: layout_height = "wrap_content" android: layout_gravity = "center_vertical"
Patrick Boos

Bunun diğer düzenlerde çalışması için, en üst ScrollView bir FrameLayout içine gömülü olması gerektiğini buldum.
Theo

1

Dikkate alınması gereken bir şey, neyin ayarlanmaması gerektiğidir . Çocuk kontrollerinizin, özellikle EditTextkontrollerin, özellik setine sahip olmadığından emin olun RequestFocus.

Bu, düzende en son yorumlanan özelliklerden biri olabilir ve üst öğesindeki ( layoutveya ScrollView) yerçekimi ayarlarını geçersiz kılar .


0

ConstraintLayout içindeki kaydırma görünümünü kullanarak. Benim için çalıştı

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

Kaydırma görünümü yüksekliği wrap_content olmalıdır

<ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.