Estoy tratando de implementar una burbuja de chat simple usando a ConstraintLayout
. Esto es lo que estoy tratando de lograr:
Sin embargo, wrap_content
parece que no funciona correctamente con restricciones. Respeta los márgenes, pero no calcula el espacio disponible correctamente. Aquí está mi diseño:
<?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>
Esto se traduce de la siguiente manera:
Estoy usando com.android.support.constraint:constraint-layout:1.0.0-beta4
.
¿Estoy haciendo algo mal? ¿Es un error o simplemente un comportamiento poco intuitivo? ¿Puedo lograr el comportamiento adecuado usando un ConstraintLayout
(sé que puedo usar otros diseños, estoy preguntando ConstrainLayout
específicamente).
android
android-layout
android-constraintlayout
Marcin Jedynak
fuente
fuente
tools:background="@drawable/chat_message_bubble"
. Para implementarlo, debe crear el archivo chat_message_bubble.xml en una carpeta dibujable y luego agregar este código:<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FB4382"/> <corners android:radius="10dip"/> </shape>
Respuestas:
Anticuado: Ver mejor respuesta
No, no puede hacer lo que quiere con ConstraintLayout tal como está hoy (1.0 beta 4):
wrap_content
solo le pide al widget que se mida a sí mismo, pero no limitará su expansión contra restricciones eventualesmatch_constraints
(0DP) será limitar el tamaño del widget en contra de las limitaciones ... pero coincidirá con ellos, incluso siwrap_content
hubiera sido más pequeño (el primer ejemplo), lo cual no es lo que quiere tampoco.Así que en este momento, no tienes suerte para ese caso en particular: - /
Ahora ... estamos pensando en agregar capacidades adicionales
match_constraints
para lidiar con este escenario exacto (comportándonos comowrap_content
si el tamaño no fuera más que las restricciones).Sin embargo, no puedo prometer que esta nueva característica llegará antes de la versión 1.0.
Editar : agregamos esta capacidad en 1.0 con el atributo
app:layout_constraintWidth_default="wrap"
(con el ancho establecido en 0dp). Si se establece, el widget tendrá el mismo tamaño que si se utiliza wrap_content, pero estará limitado por restricciones (es decir, no se expandirá más allá de ellas)Actualizar Ahora esas etiquetas están en desuso, en su lugar use layout_width = "WRAP_CONTENT" y layout_constrainedWidth = "true".
fuente
match_constraints
el compuesto, el dibujable estará a la derecha, incluso si hay texto muy corto.app:layout_constraintWidth_default="wrap"
también lo utilicé , y la v1.0.2 de la biblioteca, pero no ayudaActualizado (ConstraintLayout 1.1. +)
Usar
app:layout_constrainedWidth="true"
conandroid:layout_width="wrap_content"
Anteriormente (en desuso):
app:layout_constraintWidth_default="wrap"
conandroid:layout_width="0dp"
fuente
Sí, como se menciona en la respuesta dada por Nikolas Roard , debe agregar
app:layout_constraintWidth_default="wrap"
y establecer el ancho en 0dp. Y para alinear su burbuja correctamente, debe establecer 1.0 paralayout_constraintHorizontal_bias
.Aquí está el código fuente final:
Como resultado se ve así:
fuente
app:layout_constraintHorizontal_bias="1.0"
Como las otras respuestas ya dijeron, desde ConstraintLayout 1.0 es posible lograr eso, pero a partir de la versión más reciente (1.1.x) han cambiado la forma en que lo haces.
Desde el lanzamiento de ConstraintLayout 1.1, los atributos antiguos
app:layout_constraintWidth_default="wrap"
y ahora están en desuso .app:layout_constraintHeight_default="wrap"
Si desea proporcionar un
wrap_content
comportamiento, pero aún así imponer las restricciones en su Vista, debe establecer su ancho y / o altura para que sewrap_content
combinen con los atributosapp:layout_constrainedWidth=”true|false”
y / oapp:layout_constrainedHeight=”true|false”
, como se indica en los documentos :En cuanto a la última versión, cuando he respondido esto, ConstraintLayout está en la versión 1.1.2 .
fuente
La respuesta de @ nicolas-roard de
app:layout_constraintWidth_default="wrap"
yandroid:layout_width="0dp"
ahora está DEPRECADA .Adelante, usa
app:layout_constrainedWidth="true"
yandroid:layout_width="wrap_content"
.La razón de la depreciación, no lo sé. Pero está justo en el código fuente de ConstraintLayout
fuente
Yo uso este
fuente
Deberías reemplazar
con
desde su TextView y luego ajuste el relleno y el margen en consecuencia. He actualizado tu código,
Obtendrás este resultado
fuente