LinearLayout tidak berkembang di dalam ScrollView

371

Saya memiliki bagian LinearLayoutdalam ScrollViewyang memiliki android:layout_height="fill_parent", tetapi tidak memperluas ke ketinggian penuh ScrollView. Layout saya terlihat seperti:

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

Saya dapat melihat bahwa LinearLayouttidak memperluas ketinggian penuh ScrollViewkarena di Eclipse Android Layout Editor, jika saya memilih ScrollView(di panel Garis Besar) itu disorot dengan batas merah yang mengisi layar ke bawah tetapi ketika saya memilih LinearLayoutsorotnya tidak meluas ke bagian bawah layar. Bagaimana saya bisa melakukannya?

Efek yang saya coba capai adalah memiliki beberapa teks dan tombol di bawahnya (di LinearLayoutdalam level 4 hanya ada tombol). Teks bisa cukup besar untuk memerlukan bilah gulir, dalam hal ini saya ingin pengguna harus gulir ke bawah untuk melihat tombol. Jika teks tidak cukup besar untuk bilah gulir, saya ingin tombol yang LinearLayoutberisi menempel ke bagian bawah layar.

Pada awalnya saya pikir saya tidak boleh memposting XML lengkap karena biasanya penolakan untuk melihat sejumlah besar kode dalam sebuah pertanyaan. Namun, sepertinya itu perlu, jadi inilah tata letak lengkapnya.

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

Saat ini saya telah beralih ke android:layout_gravity="bottom"masalah LinearLayout, yang membuat tombol menempel pada bagian bawah layar tidak peduli apa. Tapi itu juga membuat teks menempel di bagian bawah layar, yang tidak persis seperti apa yang saya cari.

Pembaruan: goreskan itu, android:layout_gravity="bottom"buat yang ScrollViewtidak bisa, yah, gulir. Ide lain?

Felix
sumber

Jawaban:

956

Menemukan solusinya sendiri pada akhirnya. Masalahnya bukan dengan LinearLayout, tetapi dengan ScrollView(tampak aneh, mengingat fakta bahwa ScrollView itu berkembang, sedangkan yang LinearLayouttidak).

Solusinya adalah dengan menggunakan android:fillViewport="true"pada ScrollView.

Felix
sumber
4
Perhatikan bahwa LinearLayout akan meluas secara vertikal, tetapi ini mungkin tidak harus tercermin dalam tata letak Anda kecuali mengandung kontrol yang menggunakan ruang tambahan itu menggunakan android:weight.
Paul Lammertsma
Ini sangat membantu. Terima kasih untuk itu. Namun tanpa kode ini terkadang berfungsi dengan baik. Apa kamu tahu kenapa?
Ashokchakravarthi Nagarajan
tidak berfungsi untuk android <LinearLayout: layout_width = "fill_parent" android: layout_height = "wrap_content" android: fillViewport = "true" android: background = "# 000" android: orientasi = "vertikal"> </LinearLayout>
Prasad
3
Sangat sakit saya duduk berjam-jam dan mencari-cari apa yang salah dengan kode saya. Untuk apa paramater ini? Kapan Anda ingin menjadikannya salah?
MyWay
@ Parras membuat ketinggian tata letak linier sesuai dengan induknya
goonerDroid
22

Saya tahu posting ini sangat lama, Bagi mereka yang tidak ingin menggunakan android:fillViewport="true"karena kadang-kadang tidak memunculkan edittext keyboard di atas. Gunakan tata letak Relatif alih-alih LinearLayout yang menyelesaikan tujuannya.

Hardik4560
sumber
8

Bisakah Anda memberikan tata letak xml Anda? Melakukan hal itu akan memungkinkan orang untuk menciptakan kembali masalah dengan upaya minimal.

Anda mungkin harus mengatur

android:layout_weight="1"

untuk item yang ingin Anda kembangkan

snctln
sumber
1
Terima kasih atas jawaban Anda. Saya mencoba saran Anda tetapi tidak berhasil. Saya juga memperbarui pertanyaan saya untuk memasukkan tata letak xml.
Felix
3

Solusinya adalah menggunakan

android:fillViewport="true"

pada tampilan Gulir dan terlebih lagi coba gunakan

"wrap_content"bukannya "fill_parent"sebagai"fill_parent"

sudah usang sekarang.

Khushboo Aggarwal
sumber
2

Saya sudah terbiasa menggunakan ini secara dinamis. Saya memiliki LinearLayout dan di dalam ini digunakan ScrollView sebagai seorang anak. Lalu saya ambil lagi LinearLayout dan tambahkan apa yang pernah Anda lihat ingin LinearLayout ini dan kemudian LinearLayout ini tambahkan ke ScrollView dan akhirnya tambahkan ScrollView ini ke LinearLayout. Maka kamu bisa mendapatkan scroll di dalam ur ScrollView dan tidak ada yang tersisa untuk terlihat.

LinearLayout (Parent) - ScrollView (anak dari LinerLayout) - LinearLayout (anak dari ScrollView) - tambahkan di sini textView, Tombol, pemintal dll, apa pun yang Anda inginkan. Kemudian tambahkan LinearLyout ini ke ScrollView. Karena hanya satu ANAK untuk ScrollView yang berlaku dan terakhir tambahkan ScrollView ini ke LinearLyout. Jika area yang ditentukan melebihi dari ukuran Layar maka Anda akan mendapatkan Scroll dalam ScrollView.

Braj
sumber
Tetapi solusi ini membuat xml lebih rumit, dan membutuhkan lebih banyak waktu untuk mengembang.
twlkyao
1

Dalam kasus saya, saya belum memberikan

orientasi LinearLayout (ScrollView's Child)

Jadi secara default dibutuhkan horisontal, tetapi scrollview scrols secara vertikal, jadi silakan periksa apakah 'android: orientasi = "vertikal"' diatur ke Anak ScrollView Anda (Dalam kasus LinearLayout).

Ini adalah kasus saya berharap ini membantu seseorang

.

Vishal Pandey
sumber