Câu trả lời:
Với layout_weight
bạn có thể chỉ định tỷ lệ kích thước giữa nhiều chế độ xem. Ví dụ: bạn có một MapView
và table
sẽ 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_weight
của map
3 và layout_weight
của table
1.
Để 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.
Tóm lại, layout_weight
chỉ đị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.
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)
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)
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_weight
chỉ đị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_weight
trong 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_weight
1 và hộp văn bản thứ hai có layout_weight
2, 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)
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.
weightSum
đến với hình ảnh sau đó? Nó có liên quan gì không layout_weight
?
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
Nếu có nhiều chế độ xem kéo dài a LinearLayout
, thì layout_weight
cung cấp cho chúng một kích thước tỷ lệ. Một khung nhìn có layout_weight
giá 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.
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.
Nó là như nhau cho trọng lượng bố trí. Mỗi Views
chiều ngang LinearLayout
có 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
.)
Thứ LinearLayout
bạ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_weight
không hoạt động cho các chế độ xem trong RelativeLayouts (xem tại đây và tại đây để biết câu trả lời SO xử lý vấn đề này).
Mỗi chế độ xem theo chiều ngang LinearLayout
trô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 Button
ví 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.
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>
layout_weight
cho Android biết cách phân phối View
s 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 View
s có trọng lượng được chỉ định và đặt từng phần View
theo tỷ lệ màn hình mà nó đã chỉ định. Trong ví dụ sau, Android thấy rằng TextView
có một cái layout_weight
của 0
(đây là mặc định) và EditText
s có layout_weight
của 2
mỗi, trong khi Button
có một trọng lượng 1
. Vì vậy, Android phân bổ không gian 'vừa đủ' để hiển thị tvUsername
và tvPassword
sau đó 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 etPassword
và 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ư:
và
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
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).
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_ weight xác định bao nhiêu không gian mà điều khiển phải có được tương ứng với các điều khiển khác.
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>
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_weight
hà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.
Thêm android:autoSizeTextType="uniform"
sẽ tự động thay đổi kích thước văn bản cho bạn
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
.