Estoy tratando de implementar una burbuja de chat simple usando a ConstraintLayout. Esto es lo que estoy tratando de lograr:
Sin embargo, wrap_contentparece 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 ConstrainLayoutespecí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_contentsolo 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_contenthubiera 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_constraintspara lidiar con este escenario exacto (comportándonos comowrap_contentsi 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_constraintsel 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_contentcomportamiento, pero aún así imponer las restricciones en su Vista, debe establecer su ancho y / o altura para que sewrap_contentcombinen 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