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

을 사용하여 간단한 채팅 풍선을 구현하려고합니다 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. 구체적으로 요구하고 있습니다)를 사용 하여 올바른 동작을 얻을 수 있습니까?



답변

구식 : 더 나은 답변보기

아니요, 현재 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”를 사용하십시오.


답변

업데이트 됨 (ConstraintLayout 1.1. +)

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

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

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


답변

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

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


답변

다른 답변과 마찬가지로 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 입니다.


답변

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

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

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


답변

나는 이것을 사용한다

app:layout_constraintEnd_toEndOf="parent"

답변

교체해야합니다

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

이 결과를 얻을 수 있습니다