Chế độ xem Wrap_content bên trong ConstraintLayout trải dài bên ngoài màn hình


132

Tôi đang cố gắng thực hiện một bong bóng trò chuyện đơn giản bằng cách sử dụng a ConstraintLayout. Đây là những gì tôi đang cố gắng để đạt được:

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

Tuy nhiên, wrap_contentdường như không hoạt động đúng với các ràng buộc. Nó tôn trọng lề, nhưng không tính toán không gian có sẵn đúng cách. Đây là cách bố trí của tôi:

<?xml version="1.0" encoding="utf-8"?>
<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/chat_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintHorizontal_bias="0"
        tools:background="@drawable/chat_message_bubble"
        tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum."
        android:layout_marginStart="64dp"
        android:layout_marginLeft="64dp"
        android:layout_marginEnd="32dp"
        android:layout_marginRight="32dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp" />
</android.support.constraint.ConstraintLayout>

Điều này ám chỉ như sau:

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

Tôi đang sử dụng com.android.support.constraint:constraint-layout:1.0.0-beta4.

Tôi có làm điều gì sai? Đó là một lỗi hay chỉ là một hành vi không trực quan? Tôi có thể đạt được hành vi phù hợp bằng cách sử dụng một ConstraintLayout(tôi biết tôi có thể sử dụng các bố cục khác, tôi đang hỏi về ConstrainLayoutcụ thể).


bạn có thể đăng chế độ xem văn bản cùng với bố cục ràng buộc cha mẹ của nó không? như bạn đã biết, các thuộc tính của bố cục cha mẹ có tác động rất lớn đến trẻ em
Mohammed Atif

Nhân tiện, trong trường hợp của bạn, tôi đoán sai lệch ngang là thủ phạm. hãy thử xóa bố cục sang phải và thiên vị
Mohammed Atif

1
Sai lệch ngang là cần thiết, nếu không nếu bong bóng là trung tâm. Nếu không có bố trí bên phải, lề phải sẽ không được tính đến, đó không phải là điều chúng tôi muốn. Tôi đã cố gắng loại bỏ chúng, như bạn khuyên, nhưng nó không giúp được gì.
Marcin Jedynak

1
vấn đề là sai lệch ngang 0 cho chắc chắn. Tôi sẽ kiểm tra các giải pháp có thể và đăng nó càng sớm càng tốt vì tôi cũng đang làm việc với một cái gì đó tương tự trên bố cục ràng buộc.
Mohammed Atif

1
@nmu trò chuyện bong bóng đến từ tools:background="@drawable/chat_message_bubble". Để thực hiện nó, bạn phải tạo tệp chat_message_bubble.xml trong thư mục có thể vẽ sau đó thêm mã này: <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FB4382"/> <corners android:radius="10dip"/> </shape>
Eugene Brusov

Câu trả lời:


242

Lỗi thời: Xem câu trả lời tốt hơn

Không, bạn không thể làm những gì bạn muốn với ConstraintLayout như ngày hôm nay (1.0 beta 4):

  • wrap_content chỉ yêu cầu tiện ích tự đo, nhưng sẽ không giới hạn sự mở rộng của nó trước các ràng buộc cuối cùng
  • match_constraints(0dp) sẽ giới hạn kích thước của tiện ích đối với các ràng buộc ... nhưng sẽ khớp với chúng ngay cả khi wrap_contentnó nhỏ hơn (ví dụ đầu tiên của bạn), đây không phải là điều bạn muốn.

Vì vậy, ngay bây giờ, bạn đã hết may mắn cho trường hợp cụ thể đó: - /

Bây giờ ... chúng tôi đang suy nghĩ về việc thêm các khả năng bổ sung match_constraintsđể đối phó với kịch bản chính xác này (hành xử như thể wrap_contenttrừ khi kích thước kết thúc nhiều hơn các ràng buộc).

Tôi không thể hứa rằng tính năng mới này sẽ làm cho nó trước khi phát hành 1.0.

Chỉnh sửa : chúng tôi đã thêm khả năng này trong 1.0 với thuộc tính app:layout_constraintWidth_default="wrap"(với chiều rộng được đặt thành 0dp). Nếu được đặt, tiện ích con sẽ có cùng kích thước như khi sử dụng quấn_content, nhưng sẽ bị giới hạn bởi các ràng buộc (nghĩa là nó sẽ không mở rộng ra ngoài chúng)

Cập nhật Bây giờ các thẻ đó không được dùng nữa, thay vào đó, hãy sử dụng layout_creen = "WRAP_CONTENT" và layout_constrainedWidth = "true".


1
Đó là một vấn đề siêu đối với tôi. Tôi không thể sử dụng TextView với các drawable hợp chất ngay bây giờ bởi vì nếu tôi đặt nó thành match_constraintsdrawable hợp chất sẽ ở bên phải, ngay cả khi có văn bản rất ngắn.
Paul Woitaschek

2
@NicolasRoard: bạn có thể giúp tôi bố trí ràng buộc không, tôi có một hình ảnh ở nửa trên với hướng dẫn 0,4 và nội dung bên dưới, nhưng khi tôi đặt bố cục ràng buộc thành quấn_content thì nó chỉ chọn 0,4 màn hình (và một nửa văn bản dưới đây không hiển thị), tôi app:layout_constraintWidth_default="wrap"cũng đã sử dụng và v1.0.2 của thư viện nhưng không giúp được gì
Rat-a-tat-a-tat Ratatouille

3
ứng dụng: layout_constraintWidth_default = "quấn" với chiều rộng là 0dp, điều đó thật độc đáo!
Tunji_D

11
điều này nên được GIẢI THÍCH trong tài liệu / hướng dẫn.
SQLiteNoob

6
Chỉnh sửa nên di chuyển để có sự nổi bật lớn hơn? Loại bị mất dưới bản gốc. Đánh giá cao câu trả lời. Cảm ơn @NicolasRoard.
Tom Howard

276

Đã cập nhật (ConstraintLayout 1.1. +)

Sử dụng app:layout_constrainedWidth="true"vớiandroid:layout_width="wrap_content"

Trước đây (không dùng nữa):

app:layout_constraintWidth_default="wrap" với android:layout_width="0dp"


5
Đúng, kể từ ConstraintLayout 1.1.0 beta 2, tôi tin. androidstudio.googleblog.com/2017/10/ trên
Cừu Fifer

2
Điều này bây giờ trong phiên bản 1.1: Medium.com/google-developers/ Lần
Esdras Lopez

tình yêu chồng chất! cảm ơn đã giúp tôi giữ nội dung bọc, nhưng không bao giờ vượt quá giới hạn! #TIL
Dennis Anderson

Thật là một câu trả lời, không biết điều này tồn tại! Cảm ơn người đàn ông, sau 2 giờ chơi với các lựa chọn thay thế điều này đã làm việc một điều trị!
dev2505

23

Đúng, như đã đề cập trong câu trả lời được đưa ra bởi Nikolas Roard, bạn nên thêm app:layout_constraintWidth_default="wrap"và đặt chiều rộng thành 0dp. Và để căn chỉnh bong bóng của bạn, bạn nên đặt 1.0 cho layout_constraintHorizontal_bias.

Đây là mã nguồn cuối cùng:

<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" >

    <TextView
        android:id="@+id/chat_message"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginStart="64dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintWidth_default="wrap"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="@drawable/chat_message_bubble"
        android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum." />

</android.support.constraint.ConstraintLayout>

Kết quả là nó trông như:

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


Tôi nghĩ đó là vì OP muốn bong bóng nhỏ bên trái và của bạn là đúng, điều này thay đổi yêu cầu
Waza_Be

2
phần quan trọng ở đây làapp:layout_constraintHorizontal_bias="1.0"
Lester

9

Giống như các câu trả lời khác đã nói, vì ConstraintLayout 1.0 có thể đạt được điều đó, nhưng kể từ phiên bản mới nhất (1.1.x), họ đã thay đổi cách bạn thực hiện.

Kể từ khi phát hành ConstraintLayout 1.1, các thuộc tính app:layout_constraintWidth_default="wrap"app:layout_constraintHeight_default="wrap"thuộc tính cũ hiện không được chấp nhận .

Nếu bạn muốn cung cấp một wrap_contenthành vi, nhưng vẫn thực thi các ràng buộc trên Chế độ xem của mình, bạn nên đặt chiều rộng và / hoặc chiều cao của nó thành wrap_contentkết hợp với các thuộc tính app:layout_constrainedWidth=”true|false”và / hoặc app:layout_constrainedHeight=”true|false”, như đã nêu trên các tài liệu :

WRAP_CONTENT: thi hành các ràng buộc (Đã thêm vào 1.1) Nếu thứ nguyên được đặt thành WRAP_CONTENT, trong các phiên bản trước 1.1, chúng sẽ được coi là thứ nguyên theo nghĩa đen - nghĩa là các ràng buộc sẽ không giới hạn kích thước kết quả. Mặc dù nói chung, điều này là đủ (và nhanh hơn), trong một số trường hợp, bạn có thể muốn sử dụng WRAP_CONTENT, nhưng vẫn giữ các ràng buộc để hạn chế kích thước kết quả. Trong trường hợp đó, bạn có thể thêm một trong các thuộc tính tương ứng:

ứng dụng: layout_constrainedWidth = sự thật | false Ứng dụng trực tuyến: layout_constrainedHeight = Hồi đúng | sai

Đối với phiên bản mới nhất, vào thời điểm tôi trả lời điều này, ConstraintLayout là phiên bản 1.1.2 .


3

Khấu hao ứng dụng: layout_constraintWidth_default văn bản và thay thế của nó

Câu trả lời của @ nicolas-roard app:layout_constraintWidth_default="wrap"android:layout_width="0dp"hiện đang bị ĐỔI .

Đi trước và sử dụng app:layout_constrainedWidth="true"android:layout_width="wrap_content".

Lý do của sự phản đối, tôi không biết. Nhưng quyền của nó trong mã nguồn của ConstraintLayout


-7

Tôi dùng cái này

app:layout_constraintEnd_toEndOf="parent"

Làm thế nào để câu hỏi này của OP? Làm thế nào để bọc nội dung này?
Alex

-8

Bạn nên thay thế

android:layout_width="wrap_content"

với

android:layout_width="match_parent"

từ TextView của bạn và sau đó điều chỉnh phần đệm và lề cho phù hợp. Tôi đã cập nhật mã của bạn,

<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/chat_message"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="10dp"
    android:layout_marginLeft="60dp"
    android:layout_marginRight="10dp"
    android:layout_marginStart="60dp"
    android:layout_marginTop="8dp"
    android:padding="16dp"
    app:layout_constraintTop_toTopOf="parent"
    tools:background="#c9c7c7"
    tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum." />

Bạn sẽ nhận được kết quả này nhập mô tả hình ảnh ở đây


Bạn nên tránh sử dụng "match_parent" cho bất kỳ chế độ xem nào trong ConstraintLayout. Nhìn vào "Ghi chú" ở đây
Eugene Brusov
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.