Làm cách nào để bố trí với View lấp đầy không gian còn lại?


188

Tôi đang thiết kế giao diện người dùng ứng dụng của mình. Tôi cần một bố cục như thế này:

Ví dụ về bố cục mong muốn

(<và> là các Nút). Vấn đề là, tôi không biết làm thế nào để đảm bảo TextView sẽ lấp đầy không gian còn lại, với hai nút có kích thước cố định.

Nếu tôi sử dụng fill_parent cho Chế độ xem văn bản, nút thứ hai (>) không thể hiển thị.

Làm thế nào tôi có thể tạo một bố cục trông giống như hình ảnh?


Bạn dùng cái gì để bố trí root?
gỗ

1
@woodshy Bất kỳ Bố cục nào cũng được, không thành vấn đề.
Luke Võ

Câu trả lời:


211

Câu trả lời từ woodshy làm việc cho tôi, và nó đơn giản hơn câu trả lời của Ungureanu Liviu vì nó không sử dụng RelativeLayout. Tôi đang cho bố cục của tôi cho rõ ràng:

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

     <Button
        android:layout_width = "80dp"
        android:layout_weight = "0"
        android:layout_height = "wrap_content"
        android:text="&lt;"/>
     <TextView
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:layout_weight = "1"/>
     <Button
        android:layout_width = "80dp"
        android:layout_weight = "0"
        android:layout_height = "wrap_content"
        android:text="&gt;"/>   
 </LinearLayout>

Có những điều như alignLeftalignParentLeft, vv, mà không bao giờ có thể đạt được với LinearLayout.
IcyFlame

Tôi không hoàn toàn hiểu làm thế nào điều này là có thể nhưng thực sự là một mẹo hay để tránh RelativeLayout
a.dibacco

2
Làm thế nào đây có thể là câu trả lời được chấp nhận? Không có chế độ xem hình ảnh, đó chỉ là một phần của giải pháp. Ít nhất là nó tốt hơn câu trả lời được bình chọn hàng đầu cũ với Bố cục tương đối (Tôi đã giải thích lý do tại sao trong câu trả lời của mình)
Livio

giải pháp thiên tài
Mohammad Elsayed

92

Trong trường hợp nếu <TEXT VIEW> được đặt trong linearLayout, hãy đặt proprty Layout_ weight của <và> thành 0 và 1 cho TextView.
Trong trường hợp RelativeLayout căn chỉnh <và> sang trái và phải và đặt "Bố cục sang trái của" và "Bố cục sang phải của" thuộc tính của TextView thành id của <và>


Có ai còn cần mẫu không?
gỗ

Cách thêm hình ảnh trong bố cục này để lấp đầy toàn bộ chế độ xem
Tushar Pandey

Làm thế nào bạn sẽ thêm hình ảnh bên trong bố cục tương đối, để lấp đầy toàn bộ chế độ xem
Tushar Pandey

4
@woodshy vâng, một mẫu vẫn sẽ hữu ích
Frank Schwieterman

Hãy xem câu trả lời của Vivek Pandey để biết ví dụ
MyDogTom

71

Nếu bạn sử dụng RelativeLayout, bạn có thể làm điều đó như thế này:

<RelativeLayout
    android:layout_width = "fill_parent"
    android:layout_height = "fill_parent">
    <ImageView
        android:id = "@+id/my_image"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_alignParentTop ="true" />
    <RelativeLayout
        android:id="@+id/layout_bottom"
        android:layout_width="fill_parent"
        android:layout_height = "50dp"
        android:layout_alignParentBottom = "true">
        <Button
            android:id = "@+id/but_left"
            android:layout_width = "80dp"
            android:layout_height = "wrap_content"
            android:text="&lt;"
            android:layout_alignParentLeft = "true"/>
        <TextView
            android:layout_width = "fill_parent"
            android:layout_height = "wrap_content"
            android:layout_toLeftOf = "@+id/but_right"
            android:layout_toRightOf = "@id/but_left" />
        <Button
            android:id = "@id/but_right"
            android:layout_width = "80dp"
            android:layout_height = "wrap_content"
            android:text="&gt;"
            android:layout_alignParentRight = "true"/>
    </RelativeLayout>
</RelativeLayout>

Cảm ơn, nó hoạt động :) Nhưng tôi không hiểu. Tại sao TextView không lấp đầy tất cả khoảng trống, không phải cho >nút?
Luke Võ

2
Tại sao có hai bố trí tương đối lồng nhau? Một gốc nên là đủ. Sau đó, tất cả những gì bạn cần làm là đảm bảo rằng những đứa trẻ có bố cục tương đối phía dưới đều là alignParentBottom = "true"
Noel

@ Không, bạn nói đúng. Tôi chọn 2 bố cục vì đây là cách tôi sử dụng: trong các ứng dụng của tôi, có thể xảy ra rằng tôi cần thay đổi mức độ hiển thị của một vài chế độ xem và dễ dàng đặt tất cả chúng vào bố cục và thay đổi mức độ hiển thị chỉ cho bố cục này . Ví dụ của tôi không hoàn hảo nhưng nó hoạt động và nó có thể hữu ích cho ai đó.
Ungureanu Liviu

1
@WN Điều này cũng phù hợp với tôi :) Tôi nghĩ rằng textview không sử dụng tất cả khoảng trắng vì nút bên phải có chiều rộng cố định. Nếu bạn thay đổi android: layout_creen = "80dp" thành android: layout_creen = "quấn_content" cho nút bên phải thì nó sẽ hoạt động.
Ungureanu Liviu

2
Câu trả lời này thực sự rất tệ! Bạn nên tránh lồng 2 bố cục tương đối vì bố cục tương đối luôn tạo 2 pass cho bản vẽ (so với 1 cho bất kỳ loại bố cục nào khác). Nó trở nên theo cấp số nhân khi bạn lồng chúng. Bạn nên sử dụng bố cục tuyến tính với width = 0 và weight = 1 trên phần tử bạn muốn lấp đầy khoảng trống còn lại. Hãy nhớ rằng: chỉ sử dụng bố cục tương đối khi bạn không có lựa chọn khác. stackoverflow.com/questions/4069037/
Mạnh

30

Sử dụng một ConstraintLayout, tôi đã tìm thấy một cái gì đó như

<Button
    android:id="@+id/left_button"
    android:layout_width="80dp"
    android:layout_height="48dp"
    android:text="&lt;"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toRightOf="@+id/left_button"
    app:layout_constraintRight_toLeftOf="@+id/right_button"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/right_button"
    android:layout_width="80dp"
    android:layout_height="48dp"
    android:text="&gt;"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

làm. Chìa khóa đang đặt các ràng buộc cạnh phải, trái, trên và dưới một cách thích hợp, sau đó đặt chiều rộng và chiều cao thành 0dpvà để cho nó tìm ra kích thước của chính nó.


4
Chỉ cần bắt đầu sử dụng ConstraintLayout, thật tuyệt khi biết rằng chiều rộng và chiều cao có thể được xác định bằng các ràng buộc khi đặt chúng thành "0", Thanx cho điều đó :)
MQoder

Điều quan trọng là phải cẩn thận về hướng mũi tên của từng ràng buộc. Hãy chắc chắn rằng TextViewcó các ràng buộc trái và phải. Các TextViewkhông căng nếu là người đầu tiên Buttoncó các hạn chế quyền của TextViewvà cuối cùng Buttoncó hạn chế trái sang TextView.
Manuel

tốt hơn nhiều! cải thiện hiệu suất bằng cách không có bố trí lồng nhau. Cảm ơn đã nhắc nhở chúng tôi về thủ thuật
0dp

7

Nó đơn giản Bạn đặt minWidth hoặc minHeight, tùy thuộc vào những gì bạn đang tìm kiếm, ngang hoặc dọc. Và đối với đối tượng khác (đối tượng bạn muốn lấp đầy khoảng trống còn lại), bạn đặt trọng số là 1 (đặt chiều rộng để bọc nội dung của nó), vì vậy nó sẽ lấp đầy phần còn lại của khu vực.

<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center|left"
        android:orientation="vertical" >
</LinearLayout>
<LinearLayout
        android:layout_width="80dp"
        android:layout_height="fill_parent"
        android:minWidth="80dp" >
</LinearLayout>

4

bạn có thể sử dụng thuộc tính layout_ weight cao. Dưới đây bạn có thể thấy một bố cục trong đó ListView chiếm toàn bộ không gian trống với các nút ở phía dưới:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".ConfigurationActivity"
    android:orientation="vertical"
    >

        <ListView
            android:id="@+id/listView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1000"
            />


        <Button
            android:id="@+id/btnCreateNewRule"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Create New Rule" />



        <Button
            android:id="@+id/btnConfigureOk"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Ok" />


</LinearLayout>

3

Đối với những người có cùng trục trặc <LinearLayout...>như tôi đã làm:

Điều quan trọng là chỉ định android:layout_width="fill_parent", nó sẽ không hoạt động wrap_content.

OTOH, bạn có thể bỏ qua android:layout_weight = "0", nó không bắt buộc.

Mã của tôi về cơ bản giống như mã trong https://stackoverflow.com/a/25781167/755804 (bởi Vivek Pandey)


3

Bạn nên tránh lồng 2 bố cục tương đối vì bố cục tương đối luôn tạo 2 pass cho bản vẽ (so với 1 cho bất kỳ loại bố cục nào khác). Nó trở nên theo cấp số nhân khi bạn lồng chúng. Bạn nên sử dụng bố cục tuyến tính với width = 0 và weight = 1 trên phần tử bạn muốn lấp đầy khoảng trống còn lại. Câu trả lời này là tốt hơn cho hiệu suất và thực hành. Hãy nhớ rằng: chỉ sử dụng bố cục tương đối khi bạn không có lựa chọn khác.

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

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

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

        <Button
            android:id="@+id/prev_button"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:text="&lt;" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ellipsize="end"
            android:singleLine="true"
            android:gravity="center"
            android:text="TextView" />

        <Button
            android:id="@+id/next_button"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:text="&gt;" />
    </LinearLayout>
</LinearLayout>

0

Bạn có thể sử dụng đặt layout_widthhoặc layout_widththành 0dp(Theo hướng bạn muốn lấp đầy không gian còn lại). Sau đó sử dụng layout_weightđể làm cho nó lấp đầy không gian còn lại.


0

sử dụng Relat khóaayout để bọc tuyến tính

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:round="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">
    <Button
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text="&lt;"/>
    <TextView
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:layout_weight = "1"/>
    <Button
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text="&gt;"/>

</LinearLayout>

</RelativeLayout>`

0

tôi đã tìm thấy

 <TextView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginEnd="10dp"
        android:fontFamily="casual"
        android:text="(By Zeus B0t)"
     ``   android:textSize="10sp"
        android:gravity="bottom"
        android:textStyle="italic" />

0

Khi sử dụng bố cục tương đối, bạn có thể kéo dài chế độ xem bằng cách thả neo vào cả hai chế độ xem được cho là kéo dài về phía. Mặc dù chiều cao được chỉ định sẽ bị bỏ qua, Android vẫn yêu cầu thuộc tính chiều cao, đó là lý do tại sao tôi viết "0dp". Thí dụ:

<View
    android:id="@+id/topView"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_alignParentTop="true"
    android:layout_marginTop="8dp"/>

<View
    android:id="@+id/stretchableView"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_below="@id/topView"
    android:layout_above="@+id/bottomView"
    android:layout_marginTop="8dp"
    android:layout_marginBottom="8dp"
    android:adjustViewBounds="true"/>

<View
    android:id="@id/bottomView"
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="16dp"/>
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.