Я пытаюсь реализовать простой чат, используя расширение 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
конкретно спрашиваю ).
android
android-layout
android-constraintlayout
Марчин Едынак
источник
источник
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>
Ответы:
Устарело: см. Лучший ответ
Нет, вы не можете делать то, что хотите, с 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, но будет ограничен ограничениями (т. Е. Не будет расширяться за их пределы)Обновить. Теперь эти теги устарели, вместо них используйте layout_width = "WRAP_CONTENT" и layout_constrainedWidth = "true".
источник
match_constraints
на составные чертежи, они будут справа, даже если есть очень короткий текст.app:layout_constraintWidth_default="wrap"
тоже использовал , и v1.0.2 библиотеки, но это не помогаетОбновлено (ConstraintLayout 1.1. +)
Использовать
app:layout_constrainedWidth="true"
сandroid:layout_width="wrap_content"
Ранее (не рекомендуется):
app:layout_constraintWidth_default="wrap"
с участиемandroid:layout_width="0dp"
источник
Да, как упоминалось в ответе Николаса Роарда, вы должны добавить
app:layout_constraintWidth_default="wrap"
и установить ширину на 0dp. И чтобы выровнять ваш пузырь правильно, вы должны установить 1.0 дляlayout_constraintHorizontal_bias
.Вот окончательный исходный код:
В результате это выглядит так:
источник
app:layout_constraintHorizontal_bias="1.0"
Как уже говорилось в других ответах, начиная с 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”
, как указано в документах :Что касается последней версии, то к тому времени, как я ответил на это, ConstraintLayout находится в версии 1.1.2 .
источник
Ответ @nicolas-roard
app:layout_constraintWidth_default="wrap"
иandroid:layout_width="0dp"
теперь УСТАРЕВШИЙ .Продолжайте и используйте
app:layout_constrainedWidth="true"
иandroid:layout_width="wrap_content"
.Причина устаревания, я не знаю. Но это прямо в исходном коде ConstraintLayout
источник
Я использую этот
источник
Вам следует заменить
с участием
из вашего TextView, а затем соответствующим образом отрегулируйте отступы и поля. Я обновил ваш код,
Вы получите такой результат
источник