Android: layout_ weight có nghĩa là gì?


Câu trả lời:


860

Với layout_weightbạn có thể chỉ định tỷ lệ kích thước giữa nhiều chế độ xem. Ví dụ: bạn có một MapViewtablesẽ hiển thị một số thông tin bổ sung cho bản đồ. Bản đồ nên sử dụng 3/4 màn hình và bảng nên sử dụng 1/4 màn hình. Sau đó, bạn sẽ thiết lập layout_weightcủa map3 và layout_weightcủa table1.

Để làm cho nó hoạt động, bạn cũng phải đặt chiều cao hoặc chiều rộng (tùy theo hướng của bạn) thành 0px.


208
đầu cào cho đến khi bạn đề cập đến chiều cao 0px!
JohnnyLambada

24
Để xác định cái nào trong số chúng sẽ bị ảnh hưởng bởi trọng lượng. Chiều rộng hoặc chiều cao.
neteinstein

30
Bạn cần 0px. Ví dụ: bạn muốn triển khai một bảng có hai cột có kích thước bằng nhau. Mỗi hàng của bảng là một bố cục tuyến tính ngang với hai "ô bảng" (ví dụ: TextViews), mỗi ô có layout_ weight = .5. Nếu bạn chỉ định layout_creen = "quấn_content" trên "các ô của bảng", chiều rộng nội dung sẽ được thêm vào chiều rộng được tính theo layout_ weight, các ô của bảng sẽ có tất cả các kích thước khác nhau và các cột sẽ không được xếp chính xác. Vì vậy, bạn phải đặt layout_creen = 0dp để android chỉ sử dụng layout_ weight để tính chiều rộng của các ô.
eeeeaaii

3
@Solace, câu trả lời muộn, nhưng vì lợi ích hoàn toàn .. Có vẻ như thuộc tính trọng lượng không đóng góp cho RelativeLayout. Nó chỉ hoạt động với linearLayout. Nếu bạn thấy cần thiết, có lẽ cách tốt nhất là tạo một linearLayout (có trọng số) trong RelativeLayout.
bbv

1
không layout_ weight chỉ hoạt động cho bố cục tuyến tính hoặc nó sẽ hoạt động cho mọi nhóm xem.
meShakti

247

Tóm lại, layout_weightchỉ định bao nhiêu không gian thừa trong bố cục sẽ được phân bổ cho Chế độ xem.

LinearLayout hỗ trợ gán trọng lượng cho từng trẻ. Thuộc tính này gán giá trị "mức độ quan trọng" cho chế độ xem và cho phép nó mở rộng để lấp đầy bất kỳ không gian còn lại nào trong chế độ xem chính. Trọng lượng mặc định của lượt xem bằng không.

Tính toán để gán bất kỳ không gian còn lại giữa con

Nói chung, công thức là:

không gian được gán cho trẻ = (trọng lượng riêng của trẻ) / (tổng trọng lượng của mọi trẻ trong Bố cục tuyến tính)

ví dụ 1

Nếu có ba hộp văn bản và hai trong số chúng tuyên bố trọng số là 1, trong khi hộp thứ ba không có trọng số (0), thì không gian còn lại được chỉ định như sau:

Hộp văn bản 1 = 1 / (1 + 1 + 0)

Hộp văn bản thứ 2 = 1 / (1 + 1 + 0)

Hộp văn bản thứ 3 = 0 / (1 + 1 + 0)

Ví dụ 2

Giả sử chúng ta có một nhãn văn bản và hai thành phần chỉnh sửa văn bản trong một hàng ngang. Nhãn không có layout_weightchỉ định, vì vậy nó chiếm không gian tối thiểu cần thiết để hiển thị. Nếu một layout_weighttrong hai yếu tố chỉnh sửa văn bản được đặt thành 1, thì chiều rộng còn lại trong bố cục chính sẽ được chia đều giữa chúng (vì chúng tôi cho rằng chúng đều quan trọng như nhau).

Phép tính:

Nhãn thứ 1 = 0 / (0 + 1 + 1)

Hộp văn bản thứ 2 = 1 / (0 + 1 + 1)

Hộp văn bản thứ 3 = 1 / (0 + 1 + 1)

Thay vào đó, nếu thay vào đó, hộp văn bản thứ nhất có layout_weight1 và hộp văn bản thứ hai có layout_weight2, thì một phần ba không gian còn lại sẽ được trao cho cái thứ nhất và hai phần ba cho cái thứ hai (vì chúng tôi yêu cầu cái thứ hai một là quan trọng hơn).

Phép tính:

Nhãn thứ 1 = 0 / (0 + 1 + 2)

Hộp văn bản thứ 2 = 1 / (0 + 1 + 2)

Hộp văn bản thứ 3 = 2 / (0 + 1 + 2)


Nguồn bài viết


19
Một lời giải thích tốt hơn nhiều so với câu trả lời hiện đang được lựa chọn.
Bóng râm

12
Vâng, có lời giải thích đơn giản (mà tôi đánh giá cao) và các chi tiết khó chịu (mà tôi đánh giá cao theo một cách khác). Cả hai đều là câu trả lời tốt.
cbmanica

3
Như đã đề cập ở nơi khác, android:layout_width="0px"là quan trọng. Ngoài ra, các trọng số không cần phải là số nguyên.
Brian White

Điều này hơi khó hiểu hơn câu trả lời được chọn, nhưng nó cho câu trả lời hoàn chỉnh - đặc biệt khi một số lượt xem có trọng số và một số thì không. Đó là một trường hợp sử dụng lớn không nằm trong câu trả lời được chọn.
Acey

Nơi nào weightSumđến với hình ảnh sau đó? Nó có liên quan gì không layout_weight?
eRaisedToX

72

Thêm vào các câu trả lời khác, điều quan trọng nhất để làm việc này là đặt chiều rộng (hoặc chiều cao) của bố cục thành 0px

android:layout_width="0px"

nếu không bạn sẽ thấy rác


Tôi nghĩ điều đó phụ thuộc vào việc bạn muốn ẩn các chế độ xem không xác định trọng lượng của chúng hay bạn muốn hiển thị chúng với kích thước phù hợp với kích thước và để lại không gian trống còn lại cho các chế độ xem "có trọng số".
Andrea Leganza

Nếu tôi cần thiết lập cả trọng lượng ngang và dọc thì sao?
Alston

40

Nếu có nhiều chế độ xem kéo dài a LinearLayout, thì layout_weightcung cấp cho chúng một kích thước tỷ lệ. Một khung nhìn có layout_weightgiá trị lớn hơn "nặng" hơn, do đó, nó có được một không gian lớn hơn.

Đây là một hình ảnh để làm cho mọi thứ rõ ràng hơn.

nhập mô tả hình ảnh ở đây

Học thuyết

Thuật ngữ bố cục trọng số có liên quan đến khái niệm trung bình trọng số trong toán học. Nó giống như trong một lớp học đại học nơi bài tập về nhà trị giá 30%, điểm danh là 10%, bài kiểm tra giữa kỳ trị giá 20% và trận chung kết có giá trị 40%. Điểm số của bạn cho những phần đó, khi được cộng trọng số, cho bạn tổng điểm.

nhập mô tả hình ảnh ở đây

Nó là như nhau cho trọng lượng bố trí. Mỗi Viewschiều ngang LinearLayoutcó thể chiếm một tỷ lệ nhất định trên tổng chiều rộng. (Hoặc phần trăm chiều cao cho chiều dọc LinearLayout.)

Bố cục

Thứ LinearLayoutbạn sử dụng sẽ trông giống như thế này:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <!-- list of subviews -->

</LinearLayout>

Lưu ý rằng bạn phải sử dụng layout_width="match_parent"cho LinearLayout. Nếu bạn sử dụng wrap_content, thì nó sẽ không hoạt động. Cũng lưu ý rằng layout_weightkhông hoạt động cho các chế độ xem trong RelativeLayouts (xem tại đâytại đây để biết câu trả lời SO xử lý vấn đề này).

Quan điểm

Mỗi chế độ xem theo chiều ngang LinearLayouttrông giống như thế này:

<Button
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

Lưu ý rằng bạn cần sử dụng layout_width="0dp"cùng với layout_weight="1". Quên điều này gây ra nhiều vấn đề người dùng mới. (Xem bài viết này để biết các kết quả khác nhau mà bạn có thể nhận được bằng cách không đặt chiều rộng thành 0.) Nếu tất cả các chế độ xem của bạn theo chiều dọc LinearLayout thì bạn sẽ sử dụng layout_height="0dp".

Trong Buttonví dụ trên tôi đặt trọng số là 1, nhưng bạn có thể sử dụng bất kỳ số nào. Nó chỉ là tổng số quan trọng. Bạn có thể thấy trong ba hàng nút trong hình ảnh đầu tiên mà tôi đã đăng, các con số đều khác nhau, nhưng vì tỷ lệ là như nhau, chiều rộng có trọng số không thay đổi trong mỗi hàng. Một số người thích sử dụng các số thập phân có tổng bằng 1 để trong một bố cục phức tạp, rõ ràng trọng lượng của mỗi phần là bao nhiêu.

Một lưu ý cuối cùng. Nếu bạn có nhiều bố cục lồng nhau sử dụng layout_weight, nó có thể không tốt cho hiệu suất.

Thêm

Dưới đây là bố cục xml cho hình ảnh trên cùng:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="2" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="20"
            android:text="20" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".50"
            android:text=".50" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

    </LinearLayout>

</LinearLayout>

1
Tôi luôn tự hỏi tại sao nhiều người không đăng ảnh đi kèm với XML của họ. Nó dễ hiểu hơn nhiều so với hình ảnh.
AlexanderrH

30

layout_weightcho Android biết cách phân phối Views của bạn trong a LinearLayout. Trước tiên, Android sẽ tính tổng tỷ lệ cần thiết cho tất cả các Views có trọng lượng được chỉ định và đặt từng phần Viewtheo tỷ lệ màn hình mà nó đã chỉ định. Trong ví dụ sau, Android thấy rằng TextViewcó một cái layout_weightcủa 0(đây là mặc định) và EditTexts có layout_weightcủa 2mỗi, trong khi Buttoncó một trọng lượng 1. Vì vậy, Android phân bổ không gian 'vừa đủ' để hiển thị tvUsernametvPasswordsau đó chia phần còn lại của chiều rộng màn hình thành 5 phần bằng nhau, hai trong số đó được phân bổ cho etUsername, hai đến etPasswordvà phần cuối cùng để bLogin:

<LinearLayout android:orientation="horizontal" ...>

    <TextView android:id="@+id/tvUsername" 
    android:text="Username" 
    android:layout_width="wrap_content" ... />

    <EditText android:id="@+id/etUsername"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <TextView android:id="@+id/tvPassword"
    android:text="Password"
    android:layout_width="wrap_content" />

    <EditText android:id="@+id/etPassword"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <Button android:id="@+id/bLogin"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:text="Login"... />

</LinearLayout>

Có vẻ như:
định hướng phong cảnh
hướng dọc


liên kết không có sẵn nữa. Nếu bạn có một tài liệu tham khảo tốt, xin vui lòng cập nhật.
BinaryGuy 16/07/2015

16

Nghĩ theo cách đó, sẽ đơn giản hơn

Nếu bạn có 3 nút và trọng lượng của chúng là 1,3,1 tương ứng, nó sẽ hoạt động giống như bảng trong HTML

Cung cấp 5 phần cho dòng đó: 1 phần cho nút 1, 3 phần cho nút 2 và 1 phần cho nút 1

Trân trọng


10

một trong những lời giải thích tốt nhất cho tôi là bài này (từ hướng dẫn của Android, hãy tìm bước 7) :

layout_ weight được sử dụng trong linearLayouts để gán "mức độ quan trọng" cho Chế độ xem trong bố cục. Tất cả các Chế độ xem có bố cục mặc định là 0, nghĩa là chúng chỉ chiếm nhiều chỗ trên màn hình khi chúng cần được hiển thị. Việc chỉ định giá trị cao hơn 0 sẽ phân chia phần còn lại của không gian có sẵn trong Chế độ xem gốc, theo giá trị của bố cục của mỗi Chế độ xem và tỷ lệ của nó với bố cục tổng thể được chỉ định trong bố cục hiện tại cho phần tử Chế độ xem này và các phần tử Chế độ xem khác.

Để đưa ra một ví dụ: giả sử chúng ta có nhãn văn bản và hai thành phần chỉnh sửa văn bản trong một hàng ngang. Nhãn không có layout_ weight được chỉ định, do đó, nó chiếm không gian tối thiểu cần thiết để hiển thị. Nếu layout_ weight của mỗi trong hai thành phần chỉnh sửa văn bản được đặt thành 1, chiều rộng còn lại trong bố trí cha mẹ sẽ được chia đều giữa chúng (vì chúng tôi cho rằng chúng đều quan trọng như nhau). Nếu cái đầu tiên có layout_ weight là 1 và cái thứ hai có layout_ weight là 2, thì một phần ba không gian còn lại sẽ được dành cho cái thứ nhất và hai phần ba cho cái thứ hai (vì chúng tôi cho rằng cái thứ hai quan trọng hơn).



4

Để biết thêm :

Để verticalđịnh hướng, đừng quên đặt heightthành 0dp

android:layout_height="0dp"

Để horizontalđịnh hướng, đừng quên đặt widththành 0dp

android:layout_width="0dp"

3

Vui lòng xem weightSum của linearLayout và layout_ weight của mỗi View. android: weightSum = "4" android: layout_ weight = "2" android: layout_ weight = "2" layout_height của họ đều là 0px, nhưng tôi không chắc nó có liên quan

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="4">

<fragment android:name="com.example.SettingFragment"
    android:id="@+id/settingFragment"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    />

<Button
    android:id="@+id/dummy_button"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    android:text="DUMMY"
    />
</LinearLayout>

Vui lòng xem weightSum của linearLayout và layout_ weight của mỗi View. android: weightSum = "4" android: layout_ weight = "2" android: layout_ weight = "2" layout_height của họ đều là 0px, nhưng tôi không chắc nó có liên quan.
Ming Leung

0

Kết hợp cả hai câu trả lời từ

Flo & rptwsthi và roetzi,

Hãy nhớ thay đổi layout_width=0dp/px, nếu không, layout_weighthành vi sẽ hành động ngược lại với số lớn nhất chiếm không gian nhỏ nhất và số thấp nhất chiếm không gian lớn nhất.

Bên cạnh đó, một số kết hợp trọng lượng sẽ khiến một số bố cục không thể được hiển thị (vì nó chiếm không gian).

Coi chừng việc này.


0

Thêm android:autoSizeTextType="uniform"sẽ tự động thay đổi kích thước văn bản cho bạn


-1

Như tên cho thấy, Trọng lượng bố trí chỉ định số lượng hoặc phần trăm không gian mà một trường hoặc tiện ích cụ thể sẽ chiếm không gian màn hình.
Nếu chúng ta chỉ định trọng lượng theo hướng ngang, thì chúng ta phải chỉ định layout_width = 0px.
Tương tự, nếu chúng ta chỉ định trọng số theo hướng dọc, thì chúng ta phải chỉ định layout_height = 0px.

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.