ConstraintLayout - проблема с макетом wrap_content + toRightOf - PullRequest
1 голос
/ 01 ноября 2019

Я использую макет ограничения, и я пытаюсь сделать просмотр текста справа от направляющей, а также перенести его ширину. Однако текстовое представление по какой-то причине не использует ограничение "app:layout_constraintLeft_toRightOf="@id/guideline1"

enter image description here

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout android:id="@+id/chat_model"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginRight="15dp"
    android:layout_marginTop="15dp"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <android.support.constraint.Guideline
        android:id="@+id/guideline1"
        android:layout_width="1dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent=".25" />

    <TextView
        android:id="@+id/texview_chatmodel_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/bubble_user"
        android:padding="8dp"
        android:text="Username: aaaaaaaa aaaaa aaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
        android:textColor="@color/colorBlack"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toRightOf="@id/guideline1"
        android:gravity="right"/>

</android.support.constraint.ConstraintLayout>

Это работает, когда я устанавливаю ширину textview равной 0

android:layout_width="0dp"

Однако из-за этого возникает проблема, когда короткие сообщения расширяются до самого левого края, создавая пустое пространство.

enter image description here

Как я могу получить его так, чтобы макет сообщения находился справа от директивы, а также оборачивался его содержимым?

Это то, что я хочу:

enter image description here

, и я использовал wrap_width и horizontal_bias для достиженияэто

<TextView
      android:id="@+id/textview_chatmodel_message"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@drawable/bubble_user"
      android:padding="8dp"
      android:text="Username: aaaaaaaa "
      android:textColor="@color/colorBlack"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintLeft_toRightOf="@id/guideline1"
      app:layout_constraintHorizontal_bias="1"
      android:gravity="right"/>

однако это вызывает проблему несоблюдения ограничения Left_toRightOf guideline:

enter image description here

Как я могу получить его так, чтобы макет сообщения находился справа от направляющей, а также оборачивался его содержимым?

Ответы [ 2 ]

7 голосов
/ 01 ноября 2019

Если представление установлено на wrap_content, оно игнорирует ограничения, когда его размер превышает доступное пространство. Чтобы избежать этого, вы должны добавить этот атрибут:

app:layout_constrainedWidth="true"

Это было добавлено в ConstraintLayout версии 1.1, в более ранних версиях вам нужно было установить ширину match_constraint или 0dpдля получения аналогичного поведения.

WRAP_CONTENT: применение ограничений (добавлено в 1.1)
Если для измерения задано значение WRAP_CONTENT, вверсии до 1.1 они будут обрабатываться как буквальное измерение, то есть ограничения не будут ограничивать результирующее измерение. Хотя в целом этого достаточно (и быстрее), в некоторых ситуациях вы можете захотеть использовать WRAP_CONTENT, но продолжайте применять ограничения для ограничения результирующего измерения. В этом случае вы можете добавить один из соответствующих атрибутов:

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

0 голосов
/ 01 ноября 2019

Одним из решений может быть обтекание textView внутри группы просмотра - и тогда группа просмотра (например, относительная компоновка с выравниванием текста по правому краю) будет иметь те же ограничения, что и textView в настоящее время, и шириной 0dp? ... Я знаю, что это требуетдополнительный вид, который является своего рода обломом.

...