Перегляд Wrap_content всередині ConstraintLayout розтягується поза екраном


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

1
Горизонтальний зсув необхідний, інакше якщо міхур буде по центру. Без макета праворуч праворучне поле не враховуватиметься, чого ми не хочемо. Я намагався їх видалити, як ви порадили, але це не допомогло.
Marcin Jedynak

1
проблема - горизонтальне зміщення 0 точно. Я перевірю можливі рішення та опублікую його якнайшвидше, оскільки я також працюю з чимось подібним на макеті обмежень.
Мухаммед Атіф

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>
Євген Брусов

Відповіді:


242

Застаріло: див. Кращу відповідь

Ні, ви не можете робити те, що ви хочете з ConstraintLayout, як це є сьогодні (1.0 бета-версія 4):

  • 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 = "вірно".


1
Це супер питання для мене. Я зараз не можу використовувати TextView зі складеними рисунками, тому що якщо я встановлю його на match_constraintsскладений, то малювання буде вкрай правильним, навіть якщо є дуже короткий текст.
Пол Войташек

2
@NicolasRoard: чи можете ви, будь ласка, допомогти мені з макетом обмежень, у мене є зображення у верхній половині з орієнтиром 0,4 та вмістом внизу, але коли я встановив макет обмеження wrap_content, він набирає лише 0,4 екрана (і половину текстові огляди нижче не видно), я також використовував app:layout_constraintWidth_default="wrap"і v1.0.2 бібліотеки, але це не допомагає
Rat-a-tat-a-tat Ratatouille

3
додаток: layout_constraintWidth_default = "обгортання" шириною, як 0dp це гарно!
Tunji_D

11
це повинно бути ЕКСПЛІАТУВАННЯ в документації / інструкції.
SQLiteNoob

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 beta 2, я вважаю. androidstudio.googleblog.com/2017/10/…
Fifer Sheep

2
Це зараз у версії 1.1: medium.com/google-developers/…
Лопес,

люблю stackoverflow! дякую, це допомогло мені! зберігайте вміст обгортання, але ніколи не виходьте за межі обмежень! #TIL
Денніс Андерсон

Що відповідь, не знав, що це існує! Спасибі людина, після 2 годин гри з альтернативами це спрацювало частування!
dev2505

23

Так, як зазначено у відповіді, наданій Ніколясом Роардом, ви повинні додати 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>

В результаті це виглядає так:

введіть тут опис зображення


Я думаю, що це тому, що ОП хоче маленьку бульбашку зліва, а ваша справа, що змінює вимоги
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, але продовжувати виконувати обмеження, щоб обмежити отриманий вимір. У цьому випадку ви можете додати один із відповідних атрибутів:

додаток: layout_constrainedWidth = "вірно | помилково" додаток: layout_constrainedHeight = "true | false"

Що стосується останнього випуску, то до моменту, коли я відповів на це, ConstraintLayout знаходиться на версії 1.1.2 .


3

Застарення програми: текст layout_constraintWidth_default та його альтернатива

Відповідь @ nicolas-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"

як це відповідає на питання ОП? як це вміст обгортання?
Олексій

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

Ви отримаєте цей результат введіть тут опис зображення


Вам слід уникати використання "match_parent" для будь-якого перегляду в ConstraintLayout. Подивіться "Примітку" тут
Євген Брусов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.