Подтвердить что ты не робот

Просмотр Wrap_content внутри ConstraintLayout простирается за пределы экрана

Я пытаюсь реализовать простой чат с помощью 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).

4b9b3361

Ответ 1

Устаревший: см. Лучший ответ

Нет, вы не можете делать то, что вы хотите с ConstraintLayout, как сегодня (1.0 beta 4):

  • wrap_content только просит виджет измерить себя, но не будет ограничивать его расширение против возможных ограничений
  • match_constraints (0dp) будет ограничивать размер виджета против ограничений... но будет соответствовать им, даже если wrap_content был бы меньше (ваш первый пример), который является не то, что вы хотите либо.

Так что сейчас вам не повезло в этом конкретном случае: -/

Теперь... мы думаем о добавлении дополнительных возможностей к match_constraints чтобы справиться с этим точным сценарием (ведя себя как wrap_content если размер не заканчивается больше, чем ограничения).

Я не могу обещать, что эта новая функция появится до версии 1.0.

Изменить: мы добавили эту возможность в 1.0 с атрибутом app:layout_constraintWidth_default="wrap" (с шириной, установленной в 0dp). Если установлено, виджет будет иметь тот же размер, что и при использовании wrap_content, но будет ограничен ограничениями (то есть не будет выходить за их пределы)

Ответ 2

Обновлено (ConstraintLayout 1.1. +)

Используйте app:layout_constrainedWidth="true" с android:layout_width="wrap_content"

Ранее (устарело):

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

Ответ 3

Да, как уже упоминалось в ответе Николаса Роарда, вы должны добавить 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>

В результате это выглядит так:

enter image description here

Ответ 4

Как уже говорилось в других ответах, начиная с 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, но продолжайте применять ограничения для ограничения результирующего измерения. В этом случае вы можете добавить один из соответствующих атрибутов:

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

Что касается последней версии, к тому времени, когда я ответил на это, ConstraintLayout находится на версии 1.1.2.

Ответ 5

Deprecation of app:layout_constraintWidth_default text and its alternative

@nicolas-roard ответ app:layout_constraintWidth_default="wrap" и android:layout_width="0dp" теперь УСТАРЕЛО.

Продолжайте и используйте app:layout_constrainedWidth="true" и android:layout_width="wrap_content".

Причину износа я не знаю. Но его право в исходном коде ConstraintLayout

Ответ 6

Я использую этот

app:layout_constraintEnd_toEndOf="parent"

Ответ 7

Вы должны заменить

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

Вы получите этот результат введите описание изображения здесь