Tuyến tính không mở rộng bên trong ScrollView


371

Tôi có một LinearLayoutbên trong ScrollViewandroid:layout_height="fill_parent", nhưng nó không mở rộng đến chiều cao đầy đủ của ScrollView. Bố cục của tôi trông giống như:

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

Tôi có thể thấy rằng LinearLayoutkhông mở rộng toàn bộ chiều cao của ScrollViewvì trong Eclipse Android Layout Editor, nếu tôi chọn ScrollView(trong bảng Outline), nó được tô sáng bằng viền đỏ lấp đầy màn hình xuống phía dưới nhưng khi tôi chọn điểm sáng LinearLayoutcủa nó không mở rộng xuống phía dưới màn hình. Làm thế nào tôi có thể làm cho nó để làm như vậy?

Hiệu ứng tôi đang cố gắng đạt được là có một số văn bản và một nút bên dưới nó (bên LinearLayouttrong cấp 4 chỉ có một nút). Văn bản có thể đủ lớn để cần một thanh cuộn, trong trường hợp đó tôi muốn người dùng phải cuộn xuống để xem nút. Trong trường hợp văn bản không đủ lớn cho thanh cuộn, tôi muốn nút LinearLayoutchứa nút ở dưới cùng của màn hình.

Lúc đầu, tôi nghĩ rằng tôi không nên đăng toàn bộ XML vì thường là một lượt xuống để xem một đoạn mã lớn trong một câu hỏi. Tuy nhiên, có vẻ như nó là cần thiết, vì vậy đây là cách bố trí đầy đủ.

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

Tại thời điểm tôi đã sử dụng đến android:layout_gravity="bottom"vấn đề LinearLayout, điều này làm cho nút dính vào dưới cùng của màn hình không có vấn đề gì. Nhưng điều đó cũng làm cho văn bản dính vào dưới cùng của màn hình, đó không phải là chính xác những gì tôi đã sau.

Cập nhật: cào đó, android:layout_gravity="bottom"làm cho ScrollViewkhông thể, tốt, cuộn. Những ý tưởng khác?

Câu trả lời:


956

Tìm thấy giải pháp cho mình cuối cùng. Vấn đề không nằm ở cái LinearLayout, mà là ScrollView(có vẻ kỳ lạ, khi xem xét thực tế là cái ScrollView đang mở rộng, trong khi cái LinearLayoutkhông).

Các giải pháp là sử dụng android:fillViewport="true"trên ScrollView.


4
Lưu ý rằng linearLayout sẽ mở rộng theo chiều dọc, nhưng điều này có thể không nhất thiết được phản ánh trong bố cục của bạn trừ khi nó chứa một điều khiển tiêu tốn không gian bổ sung đó bằng cách sử dụng android:weight.
Paul Lammertsma

Điều này thực sự có ích. Cảm ơn vì điều đó. Nhưng không có mã này đôi khi hoạt động tốt. Bạn có biết tại sao?
Ashokchakravarthi Nagarajan

không làm việc cho <LinearLayout android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: fillViewport = "true" android: background = "# 000" android: định hướng = "thẳng đứng"> </ LinearLayout>
Prasad

3
Quá ốm, tôi đã ngồi hàng giờ và tìm kiếm những gì sai với mã của tôi. Vì cái gì mà paramater? Khi nào bạn muốn đặt nó sai?
MyWay

@Prasad làm cho chiều cao của bố cục tuyến tính của bạn phù hợp với cha mẹ
goonerDroid

22

Tôi biết bài đăng này rất cũ, Đối với những người không muốn sử dụng android:fillViewport="true"vì đôi khi nó không hiển thị edittext ở trên bàn phím. Sử dụng bố trí tương đối thay vì tuyến tính, nó giải quyết mục đích.


8

Bạn có thể cung cấp bố trí xml của bạn? Làm như vậy sẽ cho phép mọi người tạo lại vấn đề với nỗ lực tối thiểu.

Bạn có thể phải thiết lập

android:layout_weight="1"

cho mục mà bạn muốn mở rộng


1
Cảm ơn bạn vì câu trả lời. Tôi đã thử đề nghị của bạn nhưng nó không hoạt động. Tôi cũng cập nhật câu hỏi của tôi để bao gồm bố trí xml.
Felix

3

Giải pháp là sử dụng

android:fillViewport="true"

trên Chế độ xem cuộn và hơn thế nữa hãy thử sử dụng

"wrap_content"thay vì "fill_parent"như"fill_parent"

bây giờ không được dùng nữa


2

Tôi đã năng động sử dụng để có được điều này. Tôi có một linearLayout và trong ScrollView này được sử dụng khi còn nhỏ. Sau đó, tôi lấy lại linearLayout và thêm những gì bạn muốn Xem vào linearLayout này và sau đó, linearLayout này thêm vào ScrollView và cuối cùng thêm ScrollView này vào linearLayout. Sau đó, bạn có thể nhận được cuộn trong ScrollView của bạn và không có gì sẽ hiển thị.

LinearLayout (Parent) - ScrollView (con của linerLayout) - linearLayout (con của ScrollView) - thêm vào đây textView, các nút, spinner vv bất cứ điều gì bạn muốn. Sau đó thêm tuyến tính này vào ScrollView. Bcoz chỉ có một TRẺ cho ScrollView có thể áp dụng và cuối cùng thêm ScrollView này vào linearLyout. Nếu diện tích được xác định vượt quá kích thước Màn hình thì bạn sẽ nhận được một Scroll trong ScrollView.


Nhưng giải pháp này làm cho xml phức tạp hơn và mất nhiều thời gian hơn để tăng.
twlkyao

1

Trong trường hợp của tôi, tôi đã không đưa ra

định hướng của linearLayout (Con của ScrollView)

Vì vậy, theo mặc định, nó sẽ nằm ngang, nhưng scrollview sẽ xóa theo chiều dọc, vì vậy vui lòng kiểm tra xem 'android: direction = "vertical"' có được đặt thành ScrollView 'Child (Trong trường hợp của linearLayout).

Đây là trường hợp của tôi hy vọng nó sẽ giúp được ai đó

.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.