ConstraintLayout 내부의 Wrap_content 뷰가 화면 바깥쪽으로 펼쳐집니다.


132

을 사용하여 간단한 채팅 풍선을 구현하려고합니다 ConstraintLayout. 이것이 내가 달성하려고하는 것입니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

그러나 wrap_content제약 조건에서는 제대로 작동하지 않는 것 같습니다. 여백을 존중하지만 사용 가능한 공간을 올바르게 계산하지 않습니다. 내 레이아웃은 다음과 같습니다.

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

다음과 같이 렌더링됩니다.

여기에 이미지 설명을 입력하십시오

사용하고 com.android.support.constraint:constraint-layout:1.0.0-beta4있습니다.

내가 뭔가 잘못하고 있습니까? 버그입니까, 아니면 직관적이지 않은 행동입니까? ConstraintLayout(나는 다른 레이아웃을 사용할 수 있다는 것을 알고 있습니다 ConstrainLayout. 구체적으로 요구하고 있습니다)를 사용 하여 올바른 동작을 얻을 수 있습니까?


부모 구속 조건 레이아웃과 함께 텍스트 뷰를 게시 할 수 있습니까? 아시다시피, 부모 레이아웃의 속성은 자녀에게 큰 영향을 미칩니다
Mohammed Atif

그건 그렇고, 귀하의 경우 수평 편향이 범인이라고 생각합니다. 오른쪽에서 오른쪽으로 치우친 레이아웃을 제거해보십시오
Mohammed Atif

1
기포가 중앙에 있으면 수평 편향이 필요합니다. 오른쪽에서 오른쪽으로 레이아웃을 지정하지 않으면 오른쪽 여백이 고려되지 않으며 이는 우리가 원하는 것이 아닙니다. 조언에 따라 제거하려고 시도했지만 도움이되지 않았습니다.
Marcin Jedynak

1
문제는 수평 바이어스 0입니다. 가능한 솔루션을 확인하고 제약 조건 레이아웃과 비슷한 작업을 할 때 최대한 빨리 게시 할 것입니다.
Mohammed Atif

1
@nmu 채팅 거품은에서 온 것입니다 tools:background="@drawable/chat_message_bubble". 이를 구현하려면 드로어 블 폴더에 chat_message_bubble.xml 파일을 작성하고 다음 코드를 추가해야합니다. <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FB4382"/> <corners android:radius="10dip"/> </shape>
Eugene Brusov

답변:


242

구식 : 더 나은 답변보기

아니요, 현재 ConstraintLayout (1.0 베타 4)으로 원하는 것을 수행 할 수 없습니다.

  • wrap_content 위젯 자체 측정 만 요청하지만 최종 제약 조건에 대한 확장을 제한하지 않습니다.
  • match_constraints(0dp) 제약 조건에 따라 위젯의 크기를 제한하지만 ... wrap_content더 작을 지라도 (첫 번째 예) 일치하지만 위젯은 일치 하지 않습니다.

그래서 지금, 당신은 그 특별한 경우에 운이 없습니다 :-/

이제 우리는 match_constraints이 정확한 시나리오를 처리 하기 위해 추가 기능을 추가하려고 합니다 ( wrap_content크기가 제약 조건을 초과하지 않는 한 동작 ).

이 새로운 기능이 1.0 릴리스 이전에 만들어 질 것이라고 약속 할 수는 없습니다.

편집 : 우리는 속성 app:layout_constraintWidth_default="wrap"(폭이 0dp로 설정된)으로 1.0 에서이 기능을 추가했습니다 . 설정하면 위젯의 크기는 wrap_content를 사용하는 것과 동일하지만 제약 조건에 의해 제한됩니다 (즉, 위젯이 그 이상으로 확장되지 않음).

업데이트 이제 해당 태그는 더 이상 사용되지 않으며 대신 layout_width = "WRAP_CONTENT"및 layout_constrainedWidth = "true"를 사용하십시오.


1
그게 나에게 큰 문제입니다. 복합 드로어 블과 함께 TextView를 사용할 수 없습니다. 컴파운드 드로어 블로 설정하면 match_constraints매우 짧은 텍스트가 있더라도 맨 오른쪽에 있기 때문입니다.
Paul Woitaschek

2
@NicolasRoard : u pls가 제약 레이아웃을 도와 줄 수 있습니까, 0.4의 지침과 아래 내용으로 상단에 이미지가 있지만 제약 조건 레이아웃을 wrap_content로 설정하면 화면의 0.4 만 선택합니다 ( textviews 아래, 내가 사용) 표시되지 app:layout_constraintWidth_default="wrap"도 라이브러리의 V1.0.2하지만 도움이 나던
둥둥-A-문신 라따뚜이

3
너비가 0dp 인 app : layout_constraintWidth_default = "wrap"이 멋지게 수행합니다!
Tunji_D

11
이것은 설명서 / 지침에 명시 적이어야합니다.
SQLiteNoob

6
편집 이 더 잘 보이도록 이동 해야합니까 ? 원본 아래에서 길을 잃습니다. 대답을 감사하십시오. 감사합니다 @NicolasRoard.
Tom Howard

276

업데이트 됨 (ConstraintLayout 1.1. +)

app:layout_constrainedWidth="true"함께 사용android:layout_width="wrap_content"

이전 (더 이상 사용되지 않음) :

app:layout_constraintWidth_default="wrap"android:layout_width="0dp"


5
ConstraintLayout 1.1.0 베타 2 이후로 그렇습니다. androidstudio.googleblog.com/2017/10/…
Fifer Sheep

2
이것은 1.1 릴리스에 있습니다. medium.com/google-developers/…
Esdras Lopez

사랑하는 stackoverflow! 감사합니다. 랩 내용을 유지하되 제한을 초과하지 마십시오! #TIL
Dennis Anderson

무슨 대답이 있었는지 몰랐어요! 고마워요, 대안을 가지고 2 시간을 플레이 한 후, 이것은 대접을 받았습니다!
dev2505

23

네, Nikolas Roard의 답변에서 언급했듯이 app:layout_constraintWidth_default="wrap"너비를 추가 하고 0dp로 설정 해야합니다 . 거품을 올바르게 맞추려면에 대해 1.0을 설정해야합니다 layout_constraintHorizontal_bias.

최종 소스 코드는 다음과 같습니다.

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

결과적으로 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


OP가 왼쪽에 작은 거품을 원하고 당신이
옳기 때문에

2
여기서 중요한 부분은app:layout_constraintHorizontal_bias="1.0"
레스터

9

다른 답변과 마찬가지로 ConstraintLayout 1.0부터는 달성 할 수 있지만 최신 릴리스 (1.1.x)에서는 수행 방식이 변경되었습니다.

ConstraintLayout 1.1이 릴리스 된 이후에는 이전 app:layout_constraintWidth_default="wrap"app:layout_constraintHeight_default="wrap"속성 이 더 이상 사용되지 않습니다 .

wrap_content동작 을 제공하고 싶지만 View에서 제약 조건을 계속 적용 하려면 문서에 명시된대로 너비 및 / 또는 높이를 및 / 또는 특성 과 wrap_content결합 하도록 설정해야합니다 .app:layout_constrainedWidth=”true|false”app:layout_constrainedHeight=”true|false”

WRAP_CONTENT : 구속 조건 적용 (1.1에 추가됨) 차원이 WRAP_CONTENT로 설정되면 1.1 이전 버전에서는 리터럴 차원으로 처리됩니다. 즉, 구속 조건은 결과 차원을 제한하지 않습니다. 일반적으로 이것은 충분하고 빠르지 만 일부 상황에서는 WRAP_CONTENT를 사용하면서도 결과 차원을 제한하기 위해 구속 조건을 유지하는 것이 좋습니다. 이 경우 해당 속성 중 하나를 추가 할 수 있습니다.

app : layout_constrainedWidth =”true | false”app : layout_constrainedHeight =”true | false”

최신 릴리스에 관해서는 내가 대답 할 때까지 ConstraintLayout은 버전 1.1.2 입니다.


3

app : layout_constraintWidth_default 텍스트 사용 중단 및 대체

@의 니콜라 - roard의 대답 app:layout_constraintWidth_default="wrap"과는 android:layout_width="0dp"이제 사용되지 않음 .

가서 사용 app:layout_constrainedWidth="true"하고 android:layout_width="wrap_content".

더 이상 사용되지 않는 이유는 모르겠습니다. 그러나 ConstraintLayout의 소스 코드에서 그 권리


-7

나는 이것을 사용한다

app:layout_constraintEnd_toEndOf="parent"

이것은 어떻게 OP의 질문입니까? 이것은 어떻게 내용을 포장합니까?
Alex

-8

교체해야합니다

android:layout_width="wrap_content"

android:layout_width="match_parent"

TextView에서 패딩 및 여백을 적절하게 조정하십시오. 코드를 업데이트했습니다.

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

이 결과를 얻을 수 있습니다 여기에 이미지 설명을 입력하십시오


ConstraintLayout의 모든보기에 "match_parent"를 사용하지 않아야합니다. "주"봐 여기에
유진 Brusov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.