ไม่มีแรงโน้มถ่วงสำหรับ scrollview วิธีสร้างเนื้อหาภายใน scrollview เป็นศูนย์กลาง


105

ฉันต้องการให้เนื้อหาภายใน scrollView เป็นศูนย์กลาง

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

หมายเหตุ:ไม่มีandroid:gravityแอตทริบิวต์สำหรับ scrollvew

โซลใด ๆ : -

คำตอบ:


177

ฉันมีปัญหาเดียวกันและในที่สุดก็คิดออก ScrollViewนี้สำหรับแนวตั้ง

ใส่ScrollViewด้านในของคุณRelativeLayoutและจัดกึ่งกลางในRelativeLayout. เพื่อให้สามารถใช้งานได้คุณScrollViewควรมี

android:layout_height="wrap_content"

นี่คือลักษณะของรหัสสุดท้าย:

<?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
คำตอบนี้ดูเหมือนจะทำงานได้ดีสำหรับฉันมากกว่าคำตอบที่ยอมรับ ขอบคุณ!
Patrick Boos

ตามหลักการแล้ว Android ควรพิจารณาปัญหานี้เมื่อมีลำดับชั้นของรูปแบบ นอกจากนี้ควรมีทั้งตัวเลือกการเลื่อน (แนวนอน / แนวตั้ง) ในมุมมองแบบเลื่อนเดียวขอบคุณ BTW @hadi
mayank_droid

2
นี่เป็นการแฮ็กเล็กน้อยดังนั้นแม้ว่าจะใช้งานได้ดี แต่ก็รู้สึกผิด
DariusL

3
เฮ้มันใช้งานได้ แต่ไม่เลื่อนเมื่อมองเห็นแป้นพิมพ์ฉันพยายามเพิ่มในรายการandroid:windowSoftInputMode="stateHidden|adjustResize"แต่อย่าเลื่อนช่วยฉันด้วย
Helio Soares Junior

3
ไม่ต้องใช้งานหนักแบบRelativeLayoutรูทดู สามารถเป็นได้FrameLayoutและandroid:layout_gravity="center_vertical"สำหรับScrollView
GrafOrlov

148

แล้วเรื่องนี้ล่ะ?

<?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
ใช่ เกี่ยวกับเรื่องนี้! สิ่งนี้ได้ผลอย่างยอดเยี่ยมสำหรับฉันขอบคุณมากครับท่านผู้ใจดี
RileyE

สุดยอด! นี่ช่วยฉันด้วย! ขอบคุณ :)
marienke

101
มีปัญหาหนึ่งในเรื่องนี้ หากเนื้อหาของคุณใน ScrollView มีขนาดใหญ่กว่า scrollview มันจะยังคงจัดกึ่งกลางและตัดเนื้อหาที่ด้านบนออก (ยังไม่แน่ใจว่าทำไม) หมายความว่าคุณไม่สามารถเลื่อนไปที่นั่นได้
Patrick Boos

7
PatrickBoos ถูกต้อง; ดูเหมือนจะไม่ได้ผล ใช้คำตอบของ hadi ด้านล่างโดยจัดกึ่งกลางของ scrollview ในแนวตั้งใน RelativeLayout
Mason Lee

ใช่วิธีนี้มีข้อผิดพลาดเนื้อหาใหญ่กว่า scrollView เนื้อหาจะไม่เลื่อนไปด้านบนด้านบนของเขาเป็นจำนวนลบแปลก :(
Kross

99

ผมคิดว่าเป็นทางออกที่สง่างามมากขึ้นจะใช้ScrollViewของandroid:fillViewportสถานที่ให้บริการ A ScrollViewนั้นแตกต่างกันเล็กน้อยในการปฏิบัติต่อมุมมองเนื้อหา (สามารถมีได้เพียงอันเดียว) แม้ว่าคุณจะตั้งค่าmatch_parent( fill_parent) ให้ScrollViewมันจะไม่ให้ระยะห่างกับมุมมองเนื้อหามากขนาดนั้น แต่พฤติกรรมเริ่มต้นคือการScrollViewรวม เนื้อหาโดยไม่คำนึงถึงสิ่งที่คุณระบุสำหรับมุมมองนั้น สิ่งที่android:fillViewportบอกScrollViewให้ยืดเนื้อหาเพื่อเติมวิวพอร์ต ( http://developer.android.com/reference/android/widget/ScrollView.html#attr_android:fillViewport ) ดังนั้นในกรณีนี้ไฟล์LinearLayoutจะยืดออกเพื่อให้ตรงกับวิวพอร์ตและถ้าความสูงไปด้านหลังวิวพอร์ตก็จะเลื่อนได้ซึ่งตรงกับที่คุณต้องการ!

คำตอบที่ยอมรับจะทำงานไม่ถูกต้องเมื่อเนื้อหาขยายออกไปScrollViewเพราะจะยังคงอยู่กึ่งกลางของมุมมองเนื้อหาก่อนทำให้ตัดส่วนหนึ่งของมุมมองออกไปและScrollViewจุดศูนย์กลางในเค้าโครงอื่นใช้งานได้ แต่ไม่รู้สึกถูกต้องนอกจากนี้ ฉันคิดว่ามันจะส่งผลให้เกิดข้อผิดพลาดของผ้าสำลี (พ่อแม่ที่ไร้ประโยชน์หรืออะไรบางอย่างตามแนวเหล่านั้น)

ลองทำสิ่งนี้:

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

เพียงจำไว้ว่าเหตุผลที่มันมาอยู่ตรงกลางที่นี่ตอนนี้เป็นเพราะandroid:gravityจุดLinearLayoutเริ่มต้นที่ScrollViewจะยืดออกLinearLayoutเพื่อให้ทราบว่าขึ้นอยู่กับสิ่งที่คุณเพิ่มในรูปแบบ

อีกหนึ่งการอ่านที่ดีScrollViewแม้ว่าจะไม่เกี่ยวกับการอยู่ตรงกลาง แต่เกี่ยวกับfillViewportคือhttp://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/


11
ดูเหมือนว่าจะใช้งานได้ถูกต้องที่สุดโดยไม่ต้องมีมุมมองเพิ่มเติม
DariusL

1
ทางออกที่ดีดูเหมือนจะเป็นวิธีที่สะอาดที่สุดสำหรับฉัน ขอขอบคุณ
Benjamin Scharbau

2
ทำงานได้ดีกว่าคำตอบที่ยอมรับคุณช่วยฉันได้มาก! ทำได้ดีจริงๆ Brian Ethier!
Mattia Ruggiero

นี่เป็นวิธีแก้ปัญหาที่ถูกต้องด้วยเหตุผลทั้งหมดที่อธิบายไว้ .. หากคุณลองวิธีแก้ปัญหาข้างต้นและมุมมองการเลื่อนของคุณกว้างกว่าหน้าจอคุณจะมีส่วนหนึ่งของมุมมองแบบเลื่อนที่ไม่สามารถเข้าถึงได้และไม่สามารถเลื่อนไปได้ .. สิ่งนี้ควรได้รับการยอมรับว่าเป็นวิธีแก้ปัญหาที่เหมาะสม
Speckpgh

1
Stackoverflow ทั่วไป .. วิธีแก้ปัญหาที่ถูกต้องมักจะอยู่ตรงกลาง
Teovald

15

ใช้แอตทริบิวต์นี้ใน ScrollView

android:fillViewport="true"

ตัวอย่าง

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

อย่าลืมใช้ Single Child ใน ScrollView เช่นเดียวกับตัวอย่างด้านบนซึ่งเป็น Relativelayout


@JoshuaKing อาจเป็นเพราะคำถามเก่า 7 ปีและฉันโพสต์คำตอบนี้เมื่อเร็ว ๆ นี้เมื่อ 9 เดือนที่แล้ว
Abhishek Garg

ฮา! โอ้.. ความจริง. 😆มันทำงานได้อย่างสมบูรณ์แบบ! ขอบคุณมาก!
Joshua King

1
นี่น่าจะเป็นคำตอบที่ได้รับการยอมรับอย่างแน่นอน! ทำงานได้อย่างสมบูรณ์แบบและจัดกึ่งกลาง ScrollView หากเนื้อหามีขนาดน้อยกว่าขนาดคอนเทนเนอร์ ใช้ได้กับทั้ง ScrollView และ HorizontalScrollView ขอบคุณมาก! 💝💖
Ray Li

ซึ่งอาจมีผลโดยไม่ได้ตั้งใจในการยืดเนื้อหาของคุณในมุมมองแบบเลื่อน
martinseal1987

@ martinseal1987 ฉันคิดว่าเอฟเฟกต์จะขึ้นอยู่กับองค์ประกอบลูกของคุณว่าคุณออกแบบเค้าโครงอย่างไรแม้ว่าจะไม่ได้ผลสำหรับคุณคุณสามารถสร้างองค์ประกอบมุมมองแบบเลื่อนที่กำหนดเองได้ตามความต้องการในการออกแบบและการทำงานของคุณ และโปรดแบ่งปันภาพหน้าจอผลลัพธ์ที่คุณต้องการกับฉันเพื่อให้ฉันสามารถตรวจสอบและสามารถจัดหาโซลูชันที่ดีขึ้นและใช้งานได้ พร้อมให้ความช่วยเหลือ ไชโย
Abhishek Garg

9

สำหรับ @Patrick_Boss สิ่งที่หยุดไม่ให้ตัดเนื้อหาในแอปพลิเคชันของฉันคือการเปลี่ยนแรงโน้มถ่วงและ layout_gravity เป็น center_horizontal สำหรับ LinearLayout

มันได้ผลสำหรับฉัน ... แต่ไม่แน่ใจว่าจะเหมาะกับคุณหรือไม่

การแก้ไขคำตอบของ @ 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
วิธีนี้ช่วยแก้ปัญหาการตัดส่วนบนออก แต่ยังมีปัญหาหนึ่งในการแก้ปัญหานี้ เนื้อหา ScrollView ไม่ได้อยู่กึ่งกลางในแนวตั้ง แต่สามารถแก้ไขได้โดยตั้งค่าต่อไปนี้ของ ScrollView android: layout_height = "wrap_content" android: layout_gravity = "center_vertical"
Patrick Boos

ฉันพบว่าเพื่อให้สามารถใช้งานได้ภายในรูปแบบอื่น ๆ ต้องฝัง ScrollView ด้านบนไว้ใน FrameLayout
ธีโอ

1

สิ่งหนึ่งที่ต้องพิจารณาคือสิ่งที่จะไม่ตั้ง ทำให้บางควบคุมบุตรหลานของคุณโดยเฉพาะอย่างยิ่งEditTextการควบคุมไม่ได้RequestFocusตั้งค่าคุณสมบัติ

นี่อาจเป็นคุณสมบัติที่ตีความสุดท้ายของเค้าโครงและจะแทนที่การตั้งค่าแรงโน้มถ่วงของพ่อแม่ ( layoutหรือScrollView)


0

โดยใช้มุมมองเลื่อนภายใน ConstraintLayout มันได้ผลสำหรับฉัน

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

ความสูงของมุมมองการเลื่อนควรเป็น wrap_content

<ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.