Trọng lượng bố cục Android


84

Tôi mới bắt đầu phát triển Android và tôi có câu hỏi về cách đặt trọng số trong bố cục tuyến tính.

Tôi đang cố gắng tạo một hàng có hai nút tùy chỉnh và văn bản chỉnh sửa tùy chỉnh. Văn bản chỉnh sửa chỉ nên chiếm nhiều chỗ như nội dung của nó và hai nút phải mở rộng theo chiều ngang để lấp đầy phần còn lại của không gian có sẵn trong hàng. Như thế này...

| [#Button++#] [#Button--#] [et] |

Sau nhiều lần thử, đây là lần gần nhất tôi có thể đạt được điều mình muốn, mặc dù nó có vẻ quá phức tạp.

| [Button] [Button] [###ET###] |

<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal|center_vertical"
    android:layout_weight="1"
    >

    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_plus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_plus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/tv_dice_plus" 
                android:text="@string/tv_plus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_minus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_minus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/btn_minus" 
                android:text="@string/tv_minus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <EditText 
            android:textColor="#FAFAF4"
            android:text="@string/et_output" 
            android:id="@+id/et_output" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:inputType="number"
            android:selectAllOnFocus="true" 
            android:minWidth="50sp"         
            android:maxWidth="50sp"
            android:background="@drawable/tv_black_background3"
            android:textColorHighlight="#c30505"
            ></EditText>
    </LinearLayout>
</LinearLayout>

Theo tôi hiểu, việc đặt [android: layout_weight = "2"] cho bố cục tuyến tính giữ các nút sẽ khiến chúng chiếm nhiều chỗ hơn văn bản chỉnh sửa, nhưng đối với tôi thì ngược lại, khiến chúng có kích thước bằng một nửa.

| [Btn] [Btn] [#####et#####] |

Tôi đã thử rất nhiều cách kết hợp khác nhau mà tôi thậm chí không thể nhớ chúng, và không có cách nào hiệu quả.

Câu trả lời:


213

Nó không hoạt động vì bạn đang sử dụng fill_parent làm chiều rộng. Trọng số được sử dụng để phân phối không gian trống còn lại hoặc lấy đi không gian khi tổng tổng lớn hơn LinearLayout. Thay vào đó, hãy đặt chiều rộng của bạn thành 0dip và nó sẽ hoạt động.


6
Đặt chiều rộng trên bố cục tuyến tính thành 0dip đã hoạt động như tôi muốn. Tôi không biết đó là một lựa chọn. Nó có ý nghĩa tại sao điều đó sẽ hoạt động trong khi wrap_content sẽ không. Đặt chiều rộng thành wrap_content khi không có nội dung làm cho nó biến mất, nhưng đặt nó thành 0dip cho phép nó kéo dài từ không đến lớn đến mức cần thiết. Cảm ơn rât nhiều.
UnluckyDevil

Đặt layout_width thành "fill_parent" và layout_weight thành giá trị float như "0.2", "0.85", v.v. cũng hoạt động. Trong trường hợp này, số càng lớn thì kích thước chế độ xem càng nhỏ. bạn có thể vui lòng giải thích nếu đây là một cách chấp nhận được để làm điều đó?
Yar

37
Cái này cũng có tác dụng với tôi. Cảm ơn bạn. (Mặc dù tôi có thể nói, không ai tìm ra hệ thống bố trí android kỳ lạ và unintuitive?)
tstyle

Cảm ơn! Tôi thực sự gặp sự cố khi nói tại sao chiều rộng bố cục của tôi không hiển thị như mong đợi. Đó là khung cảnh 0dip đó đã làm nó :)
marlar

@tstyle android thật dễ dàng nếu bạn muốn làm những việc dễ dàng. Tuy nhiên, nếu bạn muốn làm nhiều hơn những điều dễ dàng, nó sẽ trở nên quá khó.
Pacerier

14

android:Layout_weightcó thể được sử dụng khi bạn không đính kèm giá trị cố định vào chiều rộng của mình như fill_parentv.v.

Làm điều gì đó như sau:

<Button>

Android:layout_width="0dp"
Android:layout_weight=1

-----other parameters
</Button>

7

Hãy 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 tương ứng là 1,3,1, 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


3

Trong linearLayout đặt WeightSum = 2;

Và phân phối trọng lượng cho các con của nó khi bạn muốn chúng hiển thị .. Tôi đã cho trọng lượng = "1" cho đứa trẻ. Vì vậy, cả hai sẽ phân phối một nửa tổng số.

 <LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="2"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/maila_oss" />
</LinearLayout>

2

giá trị trọng lượng 0-1 chia sẻ phân phối không gian có sẵn (sau khi đặt layout_width = "0px") theo tỷ lệ giá trị trọng lượng. Xem các phần tử có trọng lượng không được chỉ định (không có mục nhập trọng lượng) nhận được trọng lượng 0 có nghĩa là chúng không bị giãn nở.

Một giải pháp thay thế đơn giản mà không cần mục nhập trọng lượng là đính kèm marquee vào một dạng xem có văn bản yêu cầu nó mở rộng từ mức tối thiểu cần thiết cho văn bản (wrap_content) thành không gian có sẵn EditText: android: layout_width = "wrap_content" android: ellipsize = "marquee"


0

tôi sẽ giả sử đặt EditTextchiều rộng s wrap_contentvà đặt hai nút thành một nút LinearLayoutcó chiều rộng là fill_parentvà trọng lượng được đặt thành 1.


0

Thêm một lý do nữa mà tôi tìm thấy (nghe có vẻ mơ hồ). Bên dưới không hoạt động.

LinearLayout dọc

LinearLayout chiều cao điền vào biểu tượng + trọng lượng

LinearLayout chiều cao điền vào biểu tượng + trọng lượng

LinearLayout chiều cao điền vào biểu tượng + trọng lượng

EndLinearLayout

Công việc đã làm là gì

Giao diện tương đối

LinearLayout dọc

LinearLayout chiều cao điền vào biểu tượng + trọng lượng

LinearLayout chiều cao điền vào biểu tượng + trọng lượng

LinearLayout chiều cao điền vào biểu tượng + trọng lượng

EndLinearLayout

EndRelativeLayout

Nghe có vẻ mơ hồ bởi một bố cục gốc với Tuyến tính và các trọng số bên dưới nó không hoạt động. Và khi tôi nói "không hoạt động", ý tôi là sau khi tôi xem bố cục đồ họa giữa các độ phân giải khác nhau, độ nhất quán của màn hình đã phá vỡ một thời gian.


0
<LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="9"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
<EditText
        android:id="@+id/edittxt"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
</LinearLayout>
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.