LinearLayout ไม่ขยายภายใน ScrollView


371

ฉันมีLinearLayoutภายในScrollViewที่มีแต่มันไม่ได้ขยายความสูงเต็มรูปแบบของandroid:layout_height="fill_parent" ScrollViewเลย์เอาต์ของฉันดูเหมือน:

level    layout    layout_width    layout_height
1    LinearLayout    fill_parent    fill_parent
2    LinearLayout    fill_parent    wrap_content
3    (some irrelevant stuff)
2    ScrollView      fill_parent    fill_parent <-- this expands full height
3    LinearLayout    fill_parent    fill_parent <-- this does not (has orientation=vertical)
(following stuff probably are irrelevant, but just to be sure:)
4    TextView        fill_parent    fill_parent
4    LinearLayout    fill_parent    wrap_content

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

เอฟเฟกต์ที่ฉันพยายามทำให้สำเร็จคือมีข้อความและปุ่มด้านล่าง (ภายในLinearLayoutระดับ 4 มีเพียงปุ่มเดียว) ข้อความมีขนาดใหญ่พอที่จะต้องใช้แถบเลื่อนซึ่งในกรณีนี้ฉันต้องการให้ผู้ใช้เลื่อนลงเพื่อดูปุ่ม ในกรณีที่ข้อความมีขนาดไม่ใหญ่พอสำหรับแถบเลื่อนฉันต้องการLinearLayoutให้ปุ่มที่บรรจุนั้นติดอยู่ที่ด้านล่างของหน้าจอ

ตอนแรกฉันคิดว่าฉันไม่ควรโพสต์ XML แบบเต็มเพราะโดยปกติแล้วจะมีปัญหาในการดูโค้ดจำนวนมากในคำถาม อย่างไรก็ตามดูเหมือนว่ามันอาจจำเป็นดังนั้นนี่คือเลย์เอาต์แบบเต็ม

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/video_layout"
        android:focusable="true"
        style="@style/VideoLayout">
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:foreground="@android:drawable/ic_media_play"
            android:foregroundGravity="center">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/video_thumb"
                android:padding="5dip"
                android:background="#454545"/>
        </FrameLayout>
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:focusable="true"
            style="@style/VideoTitle"
            android:id="@+id/video_title"
            android:layout_gravity="center"
            android:layout_weight="1"/>
    </LinearLayout>
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
        <!-- this ScrollView expands the full height of the screen.
             However, the next LinearLayout does not expand the full height of the ScrollView -->
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:layout_gravity="fill"
            android:orientation="vertical"
            android:id="@+id/info_layout">
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/info_body"
                style="@style/InfoText"/>
            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                style="@android:style/ButtonBar">
                    <Button
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:layout_weight="1"
                        android:text="@string/button_readmore"
                        android:id="@+id/btn_read_more"/>
            </LinearLayout>
        </LinearLayout>
    </ScrollView>
</LinearLayout>

ตอนนี้ฉันหันไปandroid:layout_gravity="bottom"ใช้ปัญหาLinearLayoutซึ่งทำให้ปุ่มติดอยู่ที่ด้านล่างของหน้าจอไม่ว่าจะเกิดอะไรขึ้น แต่นั่นทำให้ข้อความติดที่ด้านล่างของหน้าจอซึ่งไม่ตรงกับที่ฉันเป็น

อัปเดต: ลบข้อมูลที่android:layout_gravity="bottom"ทำให้ScrollViewไม่สามารถเลื่อนดูได้ ความคิดอื่น ๆ ?

คำตอบ:


956

พบทางออกด้วยตัวเองในที่สุด ปัญหาไม่ได้อยู่กับปัญหาLinearLayoutแต่ด้วยScrollView(ดูเหมือนแปลกเมื่อพิจารณาจากข้อเท็จจริงที่ว่าScrollView กำลังขยายตัวในขณะที่LinearLayoutไม่ใช่)

การแก้ปัญหาคือการใช้ในandroid:fillViewport="true"ScrollView


4
หมายเหตุว่า LinearLayout จะขยายตัวในแนวตั้ง android:weightแต่วิธีนี้อาจไม่จำเป็นต้องสะท้อนให้เห็นในรูปแบบของคุณจนกว่าจะมีการควบคุมที่กินพื้นที่เพิ่มเติมโดยใช้
Paul Lammertsma

สิ่งนี้ช่วยได้จริงๆ ขอบคุณสำหรับสิ่งนั้น แต่ถ้าไม่มีรหัสนี้ก็ใช้งานได้ดี คุณรู้ไหมว่าทำไม?
Ashokchakravarthi Nagarajan

ไม่ทำงานสำหรับ <LinearLayout android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: fillViewport = "true" android: background = "# 000" android: ปฐมนิเทศ = "แนวตั้ง"> </LinearLayout>
Prasad

3
ฉันป่วยจึงนั่งเป็นชั่วโมงและค้นหาสิ่งผิดปกติกับรหัสของฉัน สิ่งที่พารามิเตอร์นี้หรือไม่? เมื่อใดที่คุณต้องการตั้งค่าเป็นเท็จ
MyWay

@Prasad สร้างความสูงของคุณในการจัดวางเชิงเส้นเพื่อจับคู่ผู้ปกครอง
goonerDroid

22

ฉันรู้ว่าโพสต์นี้เก่ามากสำหรับผู้ที่ไม่ต้องการใช้android:fillViewport="true"เพราะบางครั้งมันไม่ได้นำ edittext ด้านบนคีย์บอร์ด ใช้เลย์เอาต์เชิงสัมพันธ์แทน LinearLayout เพื่อแก้ไขวัตถุประสงค์


8

คุณสามารถจัดวาง xml ของคุณได้หรือไม่? การทำเช่นนั้นจะช่วยให้ผู้ใช้สามารถสร้างปัญหาขึ้นใหม่ได้โดยใช้ความพยายามน้อยที่สุด

คุณอาจต้องตั้งค่า

android:layout_weight="1"

สำหรับรายการที่คุณต้องการขยาย


1
ขอบคุณสำหรับคำตอบ. ฉันลองใช้คำแนะนำของคุณแล้ว แต่ก็ไม่ได้ผล ฉันได้อัปเดตคำถามของฉันเพื่อรวมเค้าโครง xml ด้วย
เฟลิกซ์

3

การแก้ปัญหาคือการใช้

android:fillViewport="true"

ในมุมมองเลื่อนและยิ่งกว่านั้นลองใช้

"wrap_content"แทนที่จะ"fill_parent"เป็น"fill_parent"

เลิกใช้แล้วในขณะนี้


2

ฉันใช้แบบไดนามิกเพื่อรับสิ่งนี้ ฉันมี LinearLayout และภายใน ScrollView นี้ใช้เป็นเด็ก จากนั้นฉันก็ใช้ LinearLayout อีกครั้งและเพิ่มสิ่งที่เคยดู u ต้องการให้ LinearLayout นี้และจากนั้น LinearLayout นี้จะเพิ่มใน ScrollView และในที่สุดก็เพิ่ม ScrollView นี้ให้เป็น LinearLayout จากนั้นคุณสามารถเลื่อนดูใน ScrollView ของคุณและจะไม่มีอะไรเหลือให้มองเห็น

LinearLayout (พาเรนต์) - ScrollView (ลูกของ LinerLayout) - LinearLayout (ลูกของ ScrollView) - เพิ่ม textView, ปุ่ม, สปินเนอร์และอื่น ๆ ตามที่คุณต้องการ จากนั้นเพิ่ม LinearLyout นี้ลงใน ScrollView Bcoz เพียงหนึ่ง CHILD สำหรับ ScrollView ที่ใช้งานได้และเพิ่ม ScrollView นี้เป็น LinearLyout หากพื้นที่ที่กำหนดเกินขนาดหน้าจอคุณจะได้รับ Scroll ภายใน ScrollView


แต่วิธีนี้ทำให้ xml มีความซับซ้อนมากขึ้นและใช้เวลาในการขยายมากขึ้น
twlkyao

1

ในกรณีของฉันฉันไม่ได้รับ

การวางแนวของ LinearLayout (ลูกของ ScrollView)

ดังนั้นโดยค่าเริ่มต้นมันใช้เวลาในแนวนอน แต่ scrollview scrols ในแนวตั้งดังนั้นโปรดตรวจสอบว่า 'android: ปฐมนิเทศ = "แนวตั้ง"' ถูกตั้งค่าเป็นลูกของ ScrollView ของคุณ (ในกรณีของ LinearLayout)

นี่คือกรณีของฉันหวังว่ามันจะช่วยให้ใครบางคน

.

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