có thể phân phối đồng đều các nút trên chiều rộng của một linearlayout Android


247

Tôi có một bố cục tuyến tính (định hướng theo chiều ngang) có chứa 3 nút. Tôi muốn 3 nút có chiều rộng cố định và được phân bổ đều trên chiều rộng của bố cục tuyến tính.

Tôi có thể quản lý điều này bằng cách đặt trọng lực của linearlayout vào giữa và sau đó điều chỉnh phần đệm của các nút, nhưng điều này hoạt động với chiều rộng cố định và sẽ không hoạt động để thay đổi thiết bị hoặc định hướng.

<LinearLayout android:id="@+id/LinearLayout01" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:gravity="center">

<Button 
android:id="@+id/btnOne"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>

<Button 
android:id="@+id/btnTwo"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>


<Button 
android:id="@+id/btnThree"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>

</LinearLayout>


Câu trả lời:


339

Mở rộng trên câu trả lời của fedj , nếu bạn thiết lập layout_widthđể 0dpvà thiết lập layout_weightcho mỗi người trong số các nút 1, chiều rộng có sẵn sẽ được chia đều giữa các nút.


81
Để mở rộng về điều này, nếu bạn không muốn độ rộng của các nút bằng 1/3 màn hình, hãy bọc từng nút trong một linearLayout và đặt layout_creen = "0dp" và layout_ weight = "1" trên 3 tuyến tính. Ngoài ra, hãy đặt lực hấp dẫn trên linearLayouts thành "centre" để các nút sẽ căn chỉnh ở giữa của mỗi linearLayout.
Andrew

đây là trường hợp cho LinearLayout only.can bất kỳ một đưa ra bất cứ ý tưởng cho equispacing trong RelativeLayout
user1859771

1
Trong trường hợp của tôi, tôi sử dụng layout_creen = "quấn_content" và chỉ với layout_ weight = "1" hoạt động tốt!
StefanoM5

Điều này không đúng vì OP muốn sửa. Xem câu trả lời của stoefln.
Mitulát báti

228

Nếu bạn không muốn các nút chia tỷ lệ, nhưng điều chỉnh khoảng cách giữa các nút (khoảng cách bằng nhau giữa tất cả các nút), bạn có thể sử dụng chế độ xem với weight = "1" sẽ lấp đầy khoảng trống giữa các nút:

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

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@null"
        android:gravity="center_horizontal|center_vertical"
        android:src="@drawable/tars_active" />

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

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@null"
        android:gravity="center_horizontal|center_vertical"
        android:src="@drawable/videos_active" />

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

15
Đây chắc chắn là phương pháp trên không đơn giản nhất, thấp nhất hoạt động (đối với trường hợp bạn muốn không gian giữa các khung nhìn được chia tỷ lệ, chứ không phải chính các khung nhìn). Tôi đang sử dụng nó theo chiều dọc, và vì vậy chỉ cần hoán đổi các giá trị chiều rộng và chiều cao. Cảm ơn.
samis

7
Đây là một giải pháp thanh lịch. Bạn có thể thích sử dụng Spacekiểu xem. Làm cho mọi thứ dễ đọc hơn một chút.
Ryan R

2
Ryan, vâng, đó là nếu bạn đang sử dụng API 14+ (như chúng ta nên làm).
Eduardo Naveda

Thành thật mà nói, tôi nghĩ rằng nó sẽ không hoạt động khi có 4 nút, nhưng nó hoạt động rất tốt mà không cần đo lường thời gian chạy. Sự tôn trọng!
Ashraf Alshahawy

Điều này tốt hơn câu trả lời hiện được chấp nhận.
DroidHeaven

25

Bạn có thể sử dụng nó như sau.

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="15dp">
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Reset"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="cancel"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
</LinearLayout>

đó là sweeet !! Tôi chưa bao giờ nghe nói Spacecho đến bây giờ
Ai đó ở đâu đó

21

Bạn có thể làm điều này bằng cách cho cả hai Viewsa layout_widthcủa 0dpvà một layout_weightcủa 1:

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

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

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

</LinearLayout>

Cách thức hoạt động của layout layout_ weight là:

  • đầu tiên, nó trông giống với kích thước mà Chế độ xem thường sẽ lấy và dành chỗ này.
  • thứ hai, nếu bố trí match_parentthì nó sẽ phân chia không gian còn lại theo tỷ lệ của layout_weights. Do đó, nếu bạn đã cho Lượt xem layout_weight="2"layout_weight="1", tỷ lệ kết quả sẽ là 2 trên 1, nghĩa là: Chế độ xem đầu tiên sẽ có được 2/3 không gian còn lại và chế độ xem khác 1/3.

Vì vậy, đó là lý do tại sao nếu bạn đưa ra layout_widthkích thước của 0dpbước đầu tiên thì không có ý nghĩa gì thêm vì cả hai Chế độ xem không được gán bất kỳ khoảng trắng nào. Sau đó, chỉ có điểm thứ hai quyết định không gian mà mỗi điểm Viewnhận được, do đó cung cấp cho Views không gian bạn đã chỉ định theo tỷ lệ!

Để giải thích lý do tại sao 0dpkhiến không gian phân chia bằng nhau bằng cách cung cấp một ví dụ cho thấy điều ngược lại: Mã bên dưới sẽ dẫn đến một cái gì đó khác biệt kể từ example textbây giờ có chiều rộng lớn hơn 0dpvì nó wrap_contentthay vào đó làm cho không gian trống còn lại để chia nhỏ hơn 100% bởi vì văn bản chiếm không gian. Kết quả sẽ là họ nhận được 50% dung lượng trống còn lại nhưng văn bản đã chiếm một số dung lượng nên TextViewsẽ có hơn 50% tổng dung lượng.

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

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

    <TextView
        android:layout_width="wrap_content"
        android:text="example text"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

</LinearLayout>

13

Chà, nếu bạn có chính xác 3 nút và nếu ổn (hoặc thậm chí đã được lên kế hoạch) thì các nút bên ngoài được căn chỉnh sang bên trái và bên phải thì bạn có thể muốn thử RelativeLayout ít chi phí hơn (trong nhiều tình huống).

Bạn có thể sử dụng layout_alignParentBottomđể căn chỉnh tất cả các nút với dưới cùng của bố cục. Sử dụng layout_alignParentLeft and Rightcho các nút bên ngoài và layout_centerHorizontalcho nút giữa.

Điều đó sẽ hoạt động tốt trên các định hướng và kích thước màn hình khác nhau.


Để làm rõ, điều này không hoạt động nếu bạn có nhiều hơn ba nút.
arlomedia

Chính xác. Thay vào đó, bạn phải sử dụng linearLayout hoặc Radiogroup (nếu có).
marsbear

11

Bạn nên xem qua thuộc tính android: layout_ weight


1
Theo hiểu biết của tôi, thuộc tính layout_ weight sẽ kéo dài kích thước của nút để điền vào bố cục. Tôi muốn giữ kích thước của các nút không đổi và chỉ cần tăng phần đệm giữa các nút.
yamspog

Ah ! Tôi thực sự không biết cách tốt nhất để làm điều đó. Có lẽ kèm theo mỗi nút trong bố trí. Bố cục 3 với thuộc tính layout_ weight và nút ở giữa trong bố cục. Nhưng tôi thực sự không biết liệu đó có phải là cách tốt nhất để làm điều đó không.
fedj

9

Giải pháp hiện đại cho việc này là Flexbox .

<com.google.android.flexbox.FlexboxLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:justifyContent="space_around"> <!-- or "space_between", "space_evenly" -->

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:width="120dp" />

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:width="120dp" />

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:width="120dp" />
</com.google.android.flexbox.FlexboxLayout>

Đảm bảo nhập implementation 'com.google.android:flexbox:2.0.0'

Flexboxmạnh hơn rất nhiều; nó là một bổ sung tốt cho ConstraintLayout. Đây là một nguồn tuyệt vời để tìm hiểu thêm.

Sự khác biệt giữa space_around, space_b between và space_evenly


1
cảm ơn vì đã khiến tôi (chúng tôi) nhận thức được nó. Chắc chắn hữu ích. Tôi đã sử dụng "space_around" và các nút được đặt chính giữa khi tôi có 1 hoặc 3 hiển thị trong FlexBox
Ai đó ở đâu đó vào

4

Để cách đều hai nút trong bố cục tuyến tính ngang, tôi đã sử dụng 3 đối tượng linearLayout để hoạt động như các không gian sẽ được tự động thay đổi kích thước. Tôi định vị các đối tượng tuyến tính này như sau:

[] Nút1 [] Nút2 []

([] đại diện cho một đối tượng linearLayout được sử dụng để tạo khoảng cách)

sau đó tôi đặt mỗi trọng số của [] đối tượng linearLayout này thành 1 và tôi nhận được các nút cách đều nhau.

Hi vọng điêu nay co ich.



4

Tôi đề nghị bạn sử dụng thuộc tính weightSum của linearLayout.

Thêm thẻ android:weightSum="3"vào khai báo xml của linearLayout và sau đó android:layout_weight="1"vào các Nút của bạn sẽ dẫn đến 3 nút được phân bổ đều.


4

Điều này có thể đạt được khi gán weightcho mọi nút được thêm vào bên trong container, rất quan trọng để xác định hướng ngang:

    int buttons = 5;

    RadioGroup rgp = (RadioGroup) findViewById(R.id.radio_group);

    rgp.setOrientation(LinearLayout.HORIZONTAL);

    for (int i = 1; i <= buttons; i++) {
        RadioButton rbn = new RadioButton(this);         
        rbn.setId(1 + 1000);
        rbn.setText("RadioButton" + i);
        //Adding weight
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);
        rbn.setLayoutParams(params);
        rgp.addView(rbn);
    }

do đó, chúng tôi có thể nhận được điều này trong thiết bị của chúng tôi như là kết quả:

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

ngay cả khi chúng ta xoay thiết bị của mình, weightđịnh nghĩa trong mỗi nút có thể phân phối đồng đều các phần tử dọc theo thùng chứa:

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


3

Cách tiếp cận tốt nhất là sử dụng TableLayout với android: layout_creen = "match_parent" và trong các cột sử dụng android: layout_ weight = "1" cho tất cả các cột


2

Các câu trả lời ở trên sử dụng layout_did không hoạt động với tôi, nhưng sau đây đã làm.

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_weight="0.1"
    android:layout_gravity="center_horizontal"
    >

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
       />

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"/>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"
        />

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"/>

</LinearLayout>

Đây là cách nó hiển thị trên màn hình,

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


2

Trên tất cả các câu trả lời là đúng nhưng trong trường hợp bạn cần các tính năng hiển thị và biến mất thì phương pháp thực dụng này sẽ hoạt động tốt

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

        <Button
            android:id="@+id/btnOne"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>

        <Button
            android:id="@+id/btnTwo"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>


        <Button
            android:id="@+id/btnThree"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>
    </LinearLayout>



 float width=CommonUtills.getScreenWidth(activity);
            int cardWidth=(int)CommonUtills.convertDpToPixel (((width)/3),activity);

LinearLayout.LayoutParams params =
                new LinearLayout.LayoutParams(width,
                        LinearLayout.LayoutParams.MATCH_PARENT);

btnOne.setLayoutParams(params);
btnTwo.setLayoutParams(params);
btnThree.setLayoutParams(params);

public class CommonUtills {
public static float getScreenWidth(Context context) {
        float width = (float) 360.0;
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        width = displayMetrics.widthPixels / displayMetrics.density;
        return width;
    }
}

2

Trẻ em cân nặng tương đương

Để tạo bố cục tuyến tính trong đó mỗi đứa trẻ sử dụng cùng một dung lượng trên màn hình, hãy đặt android: layout_height của mỗi chế độ xem thành "0dp" (đối với bố cục dọc) hoặc android: layout_creen của mỗi chế độ xem thành "0dp" ( cho một bố cục ngang). Sau đó, đặt android: layout_ weight của mỗi chế độ xem thành "1".

Để làm việc này trong LinearLayoutnhóm xem, các giá trị thuộc tính cho android:layout_widthandroid:layout_heightcần phải bằng "match_parent"...


Cảm ơn một người bạn đời tấn công! Tiết kiệm rất nhiều thời gian.
Xonshiz

1
Không có vấn đề bạn đời.
Gibran Castillo

0
<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:text="Tom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp" 
        android:layout_weight="3"/>

    <TextView
        android:text="Tim"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp"
        android:layout_weight="3"/>

    <TextView
        android:text="Todd"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp" 
        android:layout_weight="3"/>

</LinearLayout>

Trong vòng tròn, Tom, Tim và Todd được giả định là 3 cm. Nếu bạn muốn nó được chạm xuống màn hình, hãy đặt nó khi Tom và Tim được giả định là 1 centimet, có nghĩa là chúng kết hợp ảo nhưng mặt phẳng 2D của nó ở phía dưới. Điều này được hiển thị trên màn hình.


0
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<TextView
    android:text="Tom"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

<TextView
    android:text="Tim"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

<TextView
    android:text="Todd"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />


0

Cách dễ nhất và nhanh nhất, (nhưng không phải là tốt nhất), là thêm TextView với thuộc tính văn bản trống, như thế này

android:text=""

màu nền phải giống nhau tại linearLayout, sau đó bạn có thể sử dụng thuộc tính đệm, như thế này

android:paddingBottom="250dp"

hoặc bất cứ điều gì bạn cần. Đây là một ví dụ.

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.