Bố cục tuyến tính và trọng lượng trong Android


262

Tôi luôn đọc về giá trị trọng lượng vui nhộn này trong các tài liệu Android. Bây giờ tôi muốn thử nó lần đầu tiên nhưng nó không hoạt động.

Theo tôi hiểu từ các tài liệu bố trí này:

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

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

  </LinearLayout>

nên tạo hai nút được xếp theo chiều ngang và chia sẻ không gian bằng nhau. Vấn đề là hai nút không phát triển để lấp đầy không gian.

Tôi muốn các nút phát triển và điền vào toàn bộ dòng. Nếu cả hai nút được đặt khớp với cha mẹ, chỉ nút đầu tiên được hiển thị và lấp đầy toàn bộ dòng.


cập nhật: hỗ trợ phần trăm Android cũng có thể làm điều này rất tốt. code2concept.blogspot.in/2015/08/ từ
nitesh

Câu trả lời:


160

Bạn không thiết lập layout_weighttài sản. Mã của bạn đọc weight="1"và nó nên đọc android:layout_weight="1".


684

3 điều cần nhớ:

  • đặt android: layout_creen của trẻ em thành "0dp"
  • đặt android: weightSum của cha mẹ ( chỉnh sửa: như Jason Moore nhận thấy, thuộc tính này là tùy chọn, vì theo mặc định, nó được đặt thành tổng số layout_ weight của trẻ em)
  • đặt android: layout_ weight của mỗi đứa trẻ theo tỷ lệ (ví dụ: weightSum = "5", ba đứa trẻ: layout_ weight = "1", layout_ weight = "3", layout_ weight = "1")

Thí dụ:

    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="5">

    <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="3"
        android:text="2" />

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

    </LinearLayout>

Và kết quả:

Ví dụ về trọng lượng bố trí


66
Cảm ơn các mẹo về thiết lập chiều rộng về không. Tôi cũng thấy rằng việc thiết lập weightSum cho cha mẹ là không cần thiết.
Jason Moore

30
Tốt để biết, cảm ơn. Nếu vậy, cài đặt weightSum vẫn có thể hữu ích khi bạn không muốn con cái lấp đầy 100% của cha mẹ.
Anke

13
Điều này là chính xác cho các bố trí XML tĩnh. Nếu bạn đang thêm Chế độ xem một cách linh hoạt khi chạy, bạn sẽ cần sử dụng addView với các tham số bố cục như addView(button, new LinearLayout.LayoutParams(0, height, 1));Điều này đúng ngay cả khi bạn đang tăng bố cục với các giá trị trọng lượng và chiều rộng chính xác.
Nuthatch

Bạn nói đặt android: weightSum của cha mẹ - đặt nó thành một giá trị nào đó hoặc chỉ cần đặt nó vào, làm thế nào để được đặt?
theJerm

1
@batbrat là chính xác, tôi đã tạo UI một cách linh hoạt. Đôi khi tôi coi các đoạn XML là các mẫu và sau đó sửa đổi hoặc điền vào thời gian chạy. Thủ thuật này không hiệu quả với tôi trong trường hợp này, tôi phải đặt lại chiều rộng và trọng lượng rõ ràng để làm cho nó hoạt động.
Nuthatch

52

Đó là android:layout_weight. Trọng lượng chỉ có thể được sử dụng trong LinearLayout. Nếu hướng của linearlayout là Dọc, thì hãy sử dụng android:layout_height="0dp"và nếu hướng nằm ngang thì hãy sử dụng android:layout_width = "0dp". Nó sẽ hoạt động hoàn hảo.



16

Hãy thử đặt layout_widthcả hai nút thành "0dip" và weightcả hai nút thành0.5


Bây giờ cả hai nút đều biến mất khỏi màn hình
Janusz

được rồi, sau đó đặt chiều rộng bố cục trên cả hai thành fill_parent và trọng số là 0,5
jqpubliq

hãy nhìn vào đâyđây . Tôi hơi bối rối về lý do tại sao điều này vẫn không hoạt động nhưng có lẽ điều này sẽ cung cấp cho bạn một số ý tưởng.
jqpubliq

7

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 bằng không

tính toán để chỉ định bất kỳ không gian còn lại / thêm giữa con. (không phải tổng không gian)

không gian 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 khai báo trọng số là 1, trong khi hộp thứ ba không có trọng số (0), thì phần còn lại / Không gian thêm được gán cho

1st text box = 1/(1+1+0) 
2nd text box = 1/(1+1+0) 
3rd text box = 0/(1+1+0) 

Ví dụ (2) : 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).

calculation : 
1st label = 0/(0+1+1) 
2nd text box = 1/(0+1+1) 
3rd text box = 1/(0+1+1)

Nếu hộp văn bản thứ nhất có layout_ weight là 1 và hộp văn bản thứ hai có layout_ weight là 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 cho rằng cái thứ hai là quan trọng hơn).

calculation : 
1st label = 0/(0+1+2) 
2nd text box = 1/(0+1+2) 
3rd text box = 2/(0+1+2) 

7

Trong trường chiều rộng của nút, thay thế wrap-contentbằng 0dp.
Sử dụng thuộc tính layout_ weight của một khung nhìn.

android:layout_width="0dp"  

Đây là cách mã của bạn sẽ trông như thế nào:

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

 <Button
    android:text="Register"
    android:id="@+id/register"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />

 <Button
    android:text="Not this time"
    android:id="@+id/cancel"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />    

</LinearLayout>

layout_ weight được sử dụng để phân phối không gian còn lại thành tỷ lệ. Trong trường hợp này, hai nút có chiều rộng "0dp". Vì vậy, không gian còn lại sẽ được chia thành tỷ lệ 1: 1 trong số đó, tức là không gian sẽ được chia đều giữa các Chế độ xem Nút.


6

Giống như câu trả lời của @Manoj Seelan

Thay thế android:layout_weightbằng android:weight.

Khi bạn sử dụng Trọng lượng với LinearLayout. bạn phải thêm weightSumvào LinearLayoutvà theo định hướng của bạn LinearLayout, bạn phải thiết lập 0dpcho Width / Height là tất cả LinearLayout`s quan điểm Trẻ em

Thí dụ :

Nếu Định hướng LinearlayoutVertical, thì Đặt Độ rộng của tất cả LinearLayoutcác chế độ xem Trẻ em với0dp

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

Nếu định hướng Linearlayouthorizontal, thì Đặt Chiều cao của tất cả LinearLayoutcác chế độ xem Trẻ em với 0dp.

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

5

Có lẽ việc đặt cả hai thuộc tính layout_ference của nút thành "fill_parent" sẽ thực hiện thủ thuật.

Tôi vừa kiểm tra mã này và nó hoạt động trong trình giả lập:

<LinearLayout android:layout_width="fill_parent"
          android:layout_height="wrap_content">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="hello world"/>

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="goodbye world"/>

</LinearLayout>

Đảm bảo đặt layout_creen thành "fill_parent" trên cả hai nút.


1
Điều này chỉ đẩy nút bên phải ra khỏi màn hình và chỉ hiển thị nút đầu tiên.
Janusz

4
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/logonFormButtons"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"       
        android:orientation="horizontal">

        <Button
            android:id="@+id/logonFormBTLogon"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/logon"
            android:layout_weight="0.5" />

        <Button
            android:id="@+id/logonFormBTCancel"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/cancel"
            android:layout_weight="0.5" />
    </LinearLayout>

Bây giờ tôi muốn đề xuất sử dụng layout_ weight = "50" và layout_creen = "0px"
Yar

2

Trong XML trên, đặt android:layout_weightbố cục tuyến tính là 2: android:layout_weight="2"


3
Tại sao cần thiết? Tại sao trọng lượng bố trí của 2 quan trọng? Tại sao không phải 20 hay 200?
Conrad Frix

2

Ngoài ra, bạn cần thêm phần này android:layout_width="0dp"cho chế độ xem trẻ em [Lượt xem nút] củaLinerLayout


2

Bạn phải viết như thế này Nó làm việc cho tôi

<LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
            android:weightSum="2">

         <Button
            android:text="Register"
            android:id="@+id/register"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

         <Button
            android:text="Not this time"
            android:id="@+id/cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

2

Dưới đây là những thay đổi (Được đánh dấu bằng ĐẬM ) trong mã của bạn:

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

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

  </LinearLayout>

Vì linearLayout của bạn có hướng là ngang, do đó bạn sẽ chỉ cần giữ chiều rộng của mình là 0dp. cho việc sử dụng trọng lượng theo hướng đó. (Nếu hướng của bạn là dọc, bạn sẽ chỉ giữ chiều cao của mình là 0dp) .

Vì có 2 chế độ xem và bạn đã đặt android:layout_weight="1"cho cả hai chế độ xem, điều đó có nghĩa là nó sẽ chia hai chế độ xem bằng nhau theo hướng ngang (hoặc theo chiều rộng).


1
 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 1" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="Button 2" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 3" />

    </LinearLayout>

0

Đây là câu trả lời hoàn hảo cho vấn đề của bạn

  <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="horizontal"  >   
     <Button 
        android:text="Register" android:id="@+id/register"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
     <Button 
        android:text="Not this time" android:id="@+id/cancel"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
  </LinearLayout>

3
Vậy nó là "weight" hay "layout_ weight" ??
IgorGanapolsky

Đó là Android: layout_ weight
Mahendra Gunawardena


0
 <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:background="#008">

            <RelativeLayout
                android:id="@+id/paneltamrin"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"

                >
                <Button
                    android:id="@+id/BtnT1"
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                    android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/paneltamrin2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                >
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                     android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />

            </RelativeLayout>
        </LinearLayout>

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

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.