Khoảng cách đều nhau bằng cách sử dụng ConstraintLayout


Câu trả lời:


323

Có hai cách để thực hiện việc này bằng cách sử dụng ConstraintLayout: ChuỗiNguyên tắc . Để sử dụng Chuỗi, hãy đảm bảo bạn đang sử dụng ConstraintLayoutBeta 3 hoặc mới hơn và nếu bạn muốn sử dụng trình chỉnh sửa bố cục trực quan trong Android Studio, hãy đảm bảo bạn đang sử dụng Android Studio 2.3 Beta 1 hoặc mới hơn.

Phương pháp 1 - Sử dụng Chuỗi

Mở trình soạn thảo bố cục và thêm các widget của bạn như bình thường, thêm các ràng buộc cha nếu cần. Trong trường hợp này, tôi đã thêm hai nút có ràng buộc ở dưới cùng của cha và bên của cha mẹ (bên trái cho nút Lưu và bên phải cho nút Chia sẻ):

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

Lưu ý rằng ở trạng thái này, nếu tôi chuyển sang chế độ xem ngang, các chế độ xem không lấp đầy cha mẹ mà được neo vào các góc:

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

Làm nổi bật cả hai chế độ xem, bằng cách nhấp Ctrl / Cmd hoặc bằng cách kéo hộp quanh các chế độ xem:

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

Sau đó nhấp chuột phải vào các chế độ xem và chọn "Trung tâm theo chiều ngang":

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

Điều này thiết lập một kết nối hai chiều giữa các khung nhìn (đó là cách xác định Chuỗi). Theo mặc định, kiểu chuỗi là "lây lan", được áp dụng ngay cả khi không bao gồm thuộc tính XML. Bám sát kiểu chuỗi này nhưng thiết lập độ rộng của các chế độ xem của chúng tôi để 0dpcho phép các chế độ xem lấp đầy không gian có sẵn, trải đều trên toàn bộ cha mẹ:

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

Điều này đáng chú ý hơn trong chế độ xem phong cảnh:

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

Nếu bạn muốn bỏ qua trình soạn thảo bố cục, XML kết quả sẽ trông như sau:

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
    android:id="@+id/button_save"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="@string/button_save_text"
    android:layout_marginStart="8dp"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="4dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/button_share"
    app:layout_constraintHorizontal_chainStyle="spread" />

<Button
    android:id="@+id/button_share"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="@string/button_share_text"
    android:layout_marginStart="4dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    app:layout_constraintLeft_toRightOf="@+id/button_save"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintBottom_toBottomOf="parent" />

</android.support.constraint.ConstraintLayout>

Chi tiết:

  • đặt chiều rộng của mỗi mục thành 0dphoặc MATCH_CONSTRAINTcho phép các chế độ xem lấp đầy cha mẹ (tùy chọn)
  • các khung nhìn phải được liên kết với nhau hai chiều (bên phải nút lưu liên kết đến nút chia sẻ, bên trái liên kết nút chia sẻ để lưu nút), điều này sẽ tự động xảy ra thông qua trình chỉnh sửa bố cục khi chọn "Trung tâm theo chiều ngang"
  • Chế độ xem đầu tiên trong chuỗi có thể chỉ định kiểu chuỗi thông qua layout_constraintHorizontal_chainStyle, xem tài liệu về các kiểu chuỗi khác nhau, nếu kiểu chuỗi bị bỏ qua, mặc định là "lây lan"
  • trọng số của chuỗi có thể được điều chỉnh thông qua layout_constraintHorizontal_weight
  • ví dụ này dành cho chuỗi ngang, có các thuộc tính tương ứng cho chuỗi dọc

Phương pháp 2 - Sử dụng Hướng dẫn

Mở bố cục của bạn trong trình chỉnh sửa và nhấp vào nút hướng dẫn:

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

Sau đó chọn "Thêm hướng dẫn dọc": nhập mô tả hình ảnh ở đây

Một hướng dẫn mới sẽ xuất hiện, theo mặc định, có thể sẽ được neo vào bên trái trong các giá trị tương đối (được biểu thị bằng mũi tên quay sang trái):

bố trí biên tập hướng dẫn tương đối

Nhấp vào mũi tên quay sang trái để chuyển nó thành giá trị phần trăm, sau đó kéo hướng dẫn đến dấu 50%:

hướng dẫn phần trăm biên tập bố cục

Hướng dẫn bây giờ có thể được sử dụng như một mỏ neo cho các quan điểm khác. Trong ví dụ của tôi, tôi đã gắn bên phải nút lưu và bên trái nút chia sẻ với hướng dẫn:

bố trí cuối cùng

Nếu bạn muốn các khung nhìn lấp đầy không gian có sẵn thì ràng buộc phải được đặt thành "Bất kỳ kích thước nào" (các đường uốn lượn chạy theo chiều ngang):

bất kỳ hạn chế kích thước

(Điều này giống như cài đặt layout_widththành 0dp).

Một hướng dẫn cũng có thể được tạo bằng XML khá dễ dàng thay vì sử dụng trình soạn thảo bố cục:

<android.support.constraint.Guideline
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/guideline"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5" />

1
Tôi không thể tìm ra cách tạo một hướng dẫn với một ràng buộc. Tôi muốn một hướng dẫn theo chiều ngang ở giữa hai chế độ xem. Hãy tưởng tượng một chế độ xem lớn hơn với chiều cao 100dp ở trên và nhỏ hơn với chiều cao 50dp ở phía dưới. Tôi muốn đặt một hướng dẫn ở giữa không gian giữa chúng.
Headsvk

3
Tôi không nghĩ rằng bạn có thể thêm các ràng buộc cho chính hướng dẫn. Bạn có thể thêm nhiều hướng dẫn và sau đó giới hạn các khung nhìn vào các hướng dẫn đó. Bạn có thể muốn đăng một câu hỏi mới với chi tiết về những gì bạn đang cố gắng đạt được. Hãy dán nó trở lại đây là tốt.
AdamK

Xin cảm ơn ông. Đó là một sự giúp đỡ kịp thời và hiệu quả.
iSofia

Tôi muốn đưa ra chiều rộng tỷ lệ cho lượt xem. Ví dụ: tôi muốn nút chia sẻ có chiều rộng gấp đôi nút lưu. Không sử dụng hướng dẫn vì các chế độ xem của tôi không được đặt cạnh nhau như trong ví dụ này. có thể không
Shubham Naik

Bạn phải chuyển đổi các giá trị được đưa ra bởi hướng dẫn thành lề hoặc phần đệm thực tế. Hướng dẫn chỉ làm việc trong chế độ thiết kế.
Abhinav Saxena

49

Để tạo 2 chế độ xem trong cùng một dòng, chiều rộng bằng nhau, chỉ cần xác định

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <Button
        android:id="@+id/button1"
        android:layout_width="0dp"  
        android:layout_height="wrap_content"
        android:text="Button 1"
        app:layout_constraintEnd_toStartOf="@+id/button2"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button 2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/button1" />

</android.support.constraint.ConstraintLayout>

Ghi chú

  • chiều rộng = 0dp ( MATCH_CONSTRAINT)
  • Ràng buộc button1button2phải như trên

Kết quả

THÊM
Nếu bạn muốn View1lớn hơn View2bạn có thể sử dụng weighthoặc percent.
Ví dụ, View1chiều rộng = 2 * View2chiều rộng sử dụng trọng lượng

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

    <Button
        android:id="@+id/button3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button 3"
        app:layout_constraintEnd_toStartOf="@+id/button4"
        app:layout_constraintHorizontal_weight="2"
        app:layout_constraintStart_toStartOf="parent"
        />

    <Button
        android:id="@+id/button4"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button 4"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@+id/button3"
        />

</android.support.constraint.ConstraintLayout>

Kết quả

Ví dụ: View1width = 2 * View2width sử dụng phần trăm

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

    <Button
        android:id="@+id/button5"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button 5"
        app:layout_constraintEnd_toStartOf="@+id/button6"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintWidth_percent="0.667"
        />

    <Button
        android:id="@+id/button6"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button 6"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/button5"
        app:layout_constraintWidth_percent="0.333"
        />

</android.support.constraint.ConstraintLayout>

Kết quả


23

Vâng, nếu nó giúp được ai đó

các chính là ở đây app:layout_constraintHorizontal_weight="1"
điều tuyệt vời nhất về bố trí hạn chế là nó hỗ trợ phụ thuộc vòng tròn và đây là những gì tôi đã thực hiện bằng chính xác điều đó.

Cho con đầu lòng.
app:layout_constraintEnd_toStartOf="@+id/textInputSecondChild"

Cho con thứ hai

app:layout_constraintLeft_toRightOf="@+id/textInputFirstChild"

đây là bản demo hoàn chỉnh

<android.support.design.widget.TextInputLayout
    android:id="@+id/textInputParent"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent">

    <EditText
        android:id="@+id/editTextParent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/state" />
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:id="@+id/textInputFirstChild"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintEnd_toStartOf="@+id/textInputSecondChild"
    app:layout_constraintHorizontal_weight="1"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textInputParent">

    <EditText
        android:id="@+id/editTextChildOne"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/pin_code" />
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:id="@+id/textInputSecondChild"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintHorizontal_weight="1"
    app:layout_constraintLeft_toRightOf="@+id/textInputFirstChild"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textInputParent">

    <EditText
        android:id="@+id/editTextChildSecond"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/country" />
</android.support.design.widget.TextInputLayout>

9

Bạn shoul đọc về chuỗi trọng số. Một ví dụ về mã ở đây.

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

    <TextView
        android:id="@+id/figure_1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        app:layout_constraintEnd_toStartOf="@id/figure_2"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toStartOf="parent"
        tools:text="1"
        />

    <TextView
        android:id="@+id/figure_2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        app:layout_constraintEnd_toStartOf="@id/figure_3"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@id/figure_1"
        tools:text="2"
        />

    <TextView
        android:id="@+id/figure_3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        app:layout_constraintEnd_toStartOf="@id/figure_4"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@id/figure_2"
        tools:text="3"
        />

    <TextView
        android:id="@+id/figure_4"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@id/figure_3"
        tools:text="4"
        />
</android.support.constraint.ConstraintLayout>

Vì vậy, thiết lập android:layout_width="0dp", app:layout_constraintHorizontal_weight="1"và liên kết tất cả các quan điểm với các nước láng giềng như:

app:layout_constraintStart_toEndOf="@id/figure_2"
app:layout_constraintEnd_toStartOf="@id/figure_4"

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


những gì điểm đăng một câu trả lời chính xác như một câu trả lời khác, được đăng hai năm trước?

@Subzero, tôi đã thấy nhiều câu trả lời bằng nhau với tỷ lệ cao. Ngay cả các dòng mã là như nhau. Tôi nghi ngờ, một số tác giả sao chép từ tôi và thậm chí còn có nhiều điểm cộng hơn. Trong trường hợp này, câu trả lời là khác nhau, tôi cũng đã sử dụng các nguồn khác để hiểu cách thức hoạt động của trọng lượng ConstraintLayoutvà chỉ câu trả lời đầu tiên là không đủ để có được một hình ảnh ở trên.
CoolMind

3

Khi bạn có các mục bị xiềng xích, bạn vẫn có thể sử dụng các trọng số trên chúng như bố cục tương đối để giữ chúng cách đều nhau. Ví dụ dưới đây cho thấy cách giữ cho chúng cách đều nhau với các textView kích thước khác nhau.

<TextView1
     app:layout_constraintHorizontal_weight="1" />
 <TextView2
     app:layout_constraintHorizontal_weight="1" />
 <TextView3
     app:layout_constraintHorizontal_weight="1" />
 <TextView4
     app:layout_constraintHorizontal_weight="1" />

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.