Đặt chiều rộng để khớp với các ràng buộc trong ConstraintLayout


97

Tôi muốn giới hạn bên trái và bên phải của Chế độ xem vào lề của chế độ xem gốc và làm cho nó lấp đầy không gian được phân bổ. Tuy nhiên, đặt chiều rộng thành một trong hai match_parenthoặc wrap_contentdường như tạo ra cùng một kết quả.

Có cái gì đó tương đương với match_constraints (trái ngược với match_parent và wrap_content) không? Làm match_parentwrap_contentảnh hưởng đến bố cục hay chúng bị bỏ qua trong bố cục ràng buộc mới?

Yêu thích hệ thống bố cục mới này cho nền tảng yêu thích của tôi!


1
Tại sao match_parentkhông hiệu quả với bạn?
Eugen Martynov

Câu trả lời:


120

match_parentkhông được hỗ trợ. Với 0dp, bạn có thể coi các ràng buộc của mình là 'có thể mở rộng' hơn là 'lấp đầy những gì còn lại'.

Ngoài ra, 0dpcó thể được xác định bởi một vị trí, trong đó match_parentdựa vào vị trí gốc của nó cho vị trí của nó (x, y và chiều rộng, chiều cao)


31
tại sao câu trả lời này được chấp nhận?!? match_parent không được hỗ trợ bởi bố cục ràng buộc. Và câu trả lời này không có cách nào để thực hiện nó.
Daniele Segato

3
match_parent không được hỗ trợ.
Nicolas Roard

7
Câu trả lời này là chính xác. Nó nói rõ ràng match_parent không được hỗ trợ. Ngoài ra, để thực hiện một thay thế hợp lý cho cài đặt 'match_parent', 0dp với các ràng buộc được đặt thành cha ở bên trái và bên phải (lề 0 hoặc chọn cho phù hợp) sẽ cho kết quả tương tự. Điều duy nhất thực sự bị bỏ sót trong câu trả lời này, trong câu trả lời của Arieck, là sự cần thiết phải thiết lập các ràng buộc ở cả hai bên (hoặc trên và dưới đối với chiều dọc). Đây là cách tôi làm và tôi không gặp bất kỳ vấn đề nào. Thêm vào đó, nó hoạt động như một thiết lập trọng lượng khi được sử dụng với các thành phần khác.
Tequilaman

Nếu ai đó đến đây tìm kiếm câu trả lời cho việc nó không hoạt động. Có vẻ như nó đã bị hỏng trong bản beta. Nó dường như hoạt động trong 1.0.2. Bài học rút ra - đóng băng các thư viện, không sử dụng các bản cập nhật có cơ hội.
Inteist

1
Bình luận @Tequilaman có thể là câu trả lời. Anh ấy đã chỉ ra đúng cách để thực hiện nó. Tạo một ràng buộc ở hai bên với lề 0dp, nó thực hiện được mẹo.
Utkarsh Mankad

168

match_parentkhông được phép. Nhưng bạn thực sự có thể đặt chiều rộng và chiều cao thành 0dp và đặt các ràng buộc trên cùng và dưới cùng hoặc trái và phải thành "cha".

Vì vậy, ví dụ: nếu bạn muốn có match_parentràng buộc về chiều rộng của phần tử, bạn có thể làm như sau:

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>

4
Nhóm Android nên làm cho "match_parent" hoạt động. Nó sẽ cực kỳ dễ dàng. Đơn giản chỉ cần làm cho match_parent cung cấp chức năng tương tự như khi ứng dụng bị hạn chế bắt đầu và kết thúc gốc. Sẽ dễ dàng phát hiện theo chiều dọc hoặc chiều ngang.
bharv 14

Nhưng 0dp không dẫn đến số đo kép?
Pramod Garg

25

Rõ ràng match_parentlà:

  • KHÔNG ĐƯỢC cho các chế độ xem trực tiếp dướiConstraintLayout
  • OK đối với các chế độ xem được lồng bên trong các chế độ xem trực tiếp bên dướiConstraintLayout

Vì vậy, nếu bạn cần các khung nhìn của mình hoạt động như match_parentsau, thì:

  1. Trẻ em trực tiếp của ConstraintLayoutnên sử dụng0dp
  2. Các phần tử lồng nhau (ví dụ: cháu của ConstraintLayout) có thể sử dụngmatch_parent

Thí dụ:

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

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

        <android.support.design.widget.TextInputEditText
            android:id="@+id/phoneNumber"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    </android.support.design.widget.TextInputLayout>

Còn về một ConstraintLayout được lồng trong ConstraintLayout, trong ví dụ của bạn, hãy thay đổi TextInputLayout thành ConstraintLayout?
superuser

16

match_parentkhông được hỗ trợ bởi ConstraintLayout. Đặt chiều rộng để 0dpcho phép nó khớp với các ràng buộc.


và wrap_content có được hỗ trợ không?
KG6ZVP

Vâng, theo như tôi có thể nói.
Marcin Koziński

6
wrap_content được hỗ trợ
Romain Guy

13

Từ tài liệu chính thức :

Quan trọng: MATCH_PARENT không được khuyến nghị cho các tiện ích con có trong ConstraintLayout. Hành vi tương tự có thể được xác định bằng cách sử dụng MATCH_CONSTRAINT với các ràng buộc trái / phải hoặc trên / dưới tương ứng được đặt thành "cha".

Vì vậy, nếu bạn muốn đạt được MATCH_PARENThiệu quả, bạn có thể làm điều này:

<TextView
    android:id="@+id/textView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="TextView"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

4

Bạn có thể kiểm tra Bộ điều hợp của mình.

 1 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);
 2 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false);

Tôi đã gặp vấn đề tương tự như bạn khi tôi sử dụng 1. Bạn có thể thử 2.


Đây là vàng! Cảm ơn bạn!
grrigore

3

Không thể trực tiếp tạo chế độ xem của bạn dưới dạng match_parent, nhưng chúng ta có thể làm theo cách khác một chút, nhưng đừng quên sử dụng thuộc tính Left and Right với Start và End, nếu bạn sử dụng hỗ trợ RTL, nó sẽ cần thiết.

    <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>

2

đặt chiều rộng hoặc chiều cao (những gì bạn cần để so khớp gốc) thành 0dp và đặt lề trái, phải, trên, dưới để hoạt động như đối sánh gốc


1

trong tài liệu văn phòng: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

Khi một thứ nguyên được đặt thành MATCH_CONSTRAINT, hành vi mặc định là để kích thước kết quả chiếm tất cả không gian có sẵn.

Sử dụng 0dp, tương đương với "MATCH_CONSTRAINT"

Quan trọng: MATCH_PARENT không được khuyến nghị cho các tiện ích con có trong ConstraintLayout. Hành vi tương tự có thể được xác định bằng cách sử dụng MATCH_CONSTRAINT với các ràng buộc trái / phải hoặc trên / dưới tương ứng được đặt thành "cha"


0

Nếu bạn muốn TextView ở trung tâm của cha mẹ ..
bố trí chính của bạn là chế Layout

<androidx.appcompat.widget.AppCompatTextView
     android:layout_width="0dp"
     android:layout_height="wrap_content"
     android:text="@string/logout"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     android:gravity="center">
</androidx.appcompat.widget.AppCompatTextView>

0

Tôi đã tìm thấy một câu trả lời nữa khi có một bố cục hạn chế bên trong chế độ xem cuộn, sau đó chúng ta cần đặt

android:fillViewport="true"

đến chế độ xem cuộn

android:layout_height="0dp"

trong bố cục ràng buộc

Thí dụ:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
        android:fillViewport="true">

    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="0dp">

// Rest of the views

</androidx.constraintlayout.widget.ConstraintLayout>

</ScrollView>
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.