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

ところで、あなたの場合、私は水平バイアスが原因だと思います。右から右へのレイアウトとバイアスを削除してみてください
Mohammed Atif

1
水平バイアスが必要です。それ以外の場合は、バブルが中央に配置されます。右から右へのレイアウトがなければ、右マージンは考慮されません。これは、私たちが望むものではありません。あなたが助言したように、私はそれらを削除しようとしましたが、それは助けにはなりませんでした。
Marcin Jedynak

1
問題は確かに水平バイアス0です。可能な解決策を確認し、制約レイアウトで同様の作業もしているのでできるだけ早く投稿します。
Mohammed Atif 2016年

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>
ユージンBrusov

回答:


242

時代遅れ:より良い答えを見る

いいえ、現在の(1.0ベータ4)のように、ConstraintLayoutで必要なことを行うことはできません。

  • wrap_content ウィジェットにそれ自体を測定するように要求するだけで、最終的な制約に対してウィジェットの拡張を制限しません
  • match_constraints(0dp)、制約に対してウィジェットのサイズを制限しますが、wrap_content小さくなっても(最初の例)、それらを一致させます。

だから今、あなたはその特定のケースのために運が悪いです:-/

今... match_constraintsこの正確なシナリオに対処するために追加の機能を追加することを考えています(wrap_contentサイズが制約よりも大きくならない限り、動作します)。

ただし、この新機能が1.0リリースより前にリリースされるとは約束できません。

編集:この機能を1.0に属性とともに追加しましたapp:layout_constraintWidth_default="wrap"(幅を0dpに設定)。設定されている場合、ウィジェットはwrap_contentを使用する場合と同じサイズになりますが、制約によって制限されます(つまり、ウィジェットを超えて拡張されません)

更新 これらのタグは非推奨になりました。代わりに、layout_width = "WRAP_CONTENT"およびlayout_constrainedWidth = "true"を使用してください。


1
それは私にとって大きな問題です。TextViewを現在複合ドローアブルで使用することはできません。これを設定するとmatch_constraints、非常に短いテキストがあったとしても、複合ドローアブルが右端にあるからです。
Paul Woitaschek 2017年

2
@NicolasRoard:制約レイアウトで私を助けることができます、私は上半分に0.4のガイドラインと下のコンテンツを含む画像を持っていますが、制約レイアウトをwrap_contentに設定すると、画面の0.4(および以下のテキストビューは表示されません)、私も使用しapp:layout_constraintWidth_default="wrap"ました。ライブラリのv1.0.2ですが、役に立ちません
Rat-a-tat-a-tat Ratatouille 2017

3
app:layout_constraintWidth_default = "wrap"の幅が0dpの場合、うまく機能します!
Tunji_D 2017

11
これは、ドキュメント/説明ではEXPLICITである必要があります。
SQLiteNoob 2017

6
万一編集大きな隆起を持っている動きは?オリジナルの下にある種のものが失われます。答えを感謝します。@NicolasRoardに感謝します。
トムハワード

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/...
笛を吹く少年の羊

2
これは現在1.1リリースにあります。medium.com
Lopez

Stackoverflowが大好きです!おかげでこれは私を助けました!ラップコンテンツを保持しますが、制約を超えないでください。#TIL
デニスアンダーソン

なんという答えでしょう、これが存在することを知りませんでした!おかげで、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が左側に小さなバブルを望んでいて、それが正しいためであり、要件が変更されるためです
Waza_Be

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動作を提供したいが、それでもビューに制約を適用する場合は、ドキュメントに記載れているように、その幅または高さ、あるいはその両方を属性とwrap_content組み合わせて設定する必要がapp:layout_constrainedWidth=”true|false”ありapp:layout_constrainedHeight=”true|false”ます。

WRAP_CONTENT:制約の適用(1.1で追加)ディメンションがWRAP_CONTENTに設定されている場合、1.1より前のバージョンでは、それらはリテラルディメンションとして扱われます。つまり、制約は結果のディメンションを制限しません。一般的にはこれで十分(かつ高速)ですが、状況によっては、WRAP_CONTENTを使用したいが、結果のディメンションを制限するために制約を適用し続ける場合があります。その場合、対応する属性の1つを追加できます。

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」を使用しないでください。こちらの
ユージーンブルソフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.