wrap_content working studio not dinamico android android-layout android-constraintlayout constraint-layout

working - listview dinamico android studio



La vista Wrap_content dentro de ConstraintLayout se extiende fuera de la pantalla (7)

Estoy tratando de implementar una burbuja de chat simple usando ConstraintLayout . Esto es lo que estoy tratando de lograr:

Sin embargo, wrap_content parece no funcionar 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 representa lo siguiente:

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 sobre ConstrainLayout específicamente).


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 eventuales restricciones
  • match_constraints (0dp) limitará el tamaño del widget a las restricciones ... pero las igualará incluso si wrap_content hubiera sido más pequeño (su primer ejemplo), que tampoco es lo que desea.

Así que en este momento, no tienes suerte para ese caso en particular: - /

Ahora ... estamos pensando en agregar capacidades adicionales a match_constraints para lidiar con este escenario exacto (comportarse como wrap_content menos que el tamaño termine siendo 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 la app:layout_constraintWidth_default="wrap" atributos app:layout_constraintWidth_default="wrap" (con 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)


Actualizado (ConstraintLayout 1.1. +)

Use la app:layout_constrainedWidth="true" con el ancho establecido en wrap_content

Anteriormente (en desuso):

app:layout_constraintWidth_default="wrap" con ancho establecido en 0dp


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 app:layout_constraintWidth_default="wrap" y app:layout_constraintHeight_default="wrap" ahora están en desuso .

Si desea proporcionar un comportamiento wrap_content , pero aún así imponer las restricciones en su Vista, debe establecer su ancho y / o altura en wrap_content combinado con la app:layout_constrainedWidth=”true|false” y / o app:layout_constrainedHeight=”true|false” , como se indica en los documentos :

WRAP_CONTENT: imponer restricciones (agregado en 1.1) Si una dimensión se establece en WRAP_CONTENT, en las versiones anteriores a 1.1 se tratarán como una dimensión literal, lo que significa que las restricciones no limitarán la dimensión resultante. Si bien en general esto es suficiente (y más rápido), en algunas situaciones, es posible que desee utilizar WRAP_CONTENT, sin embargo, siga imponiendo restricciones para limitar la dimensión resultante. En ese caso, puede agregar uno de los atributos correspondientes:

aplicación: layout_constrainedWidth = ”true | false” aplicación: layout_constrainedHeight = ”true | false”

En cuanto a la última versión, cuando he respondido esto, ConstraintLayout está en la versión 1.1.2 .


Deberías reemplazar

android:layout_width="wrap_content"

con

android:layout_width="match_parent"

desde su TextView y luego ajuste el relleno y el margen en consecuencia. He actualizado tu código,

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

Obtendrás este resultado


Sí, como se menciona en la respuesta dada por , debe agregar la app:layout_constraintWidth_default="wrap" y establecer el ancho en 0dp. Y para alinear su burbuja correctamente, debe establecer 1.0 para layout_constraintHorizontal_bias .

Aquí está el código fuente final:

<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>

Como resultado se ve así:


Yo uso este

app:layout_constraintEnd_toEndOf="parent"


La respuesta de la app:layout_constraintWidth_default="wrap" de @ nicolas-roard app:layout_constraintWidth_default="wrap" y android:layout_width="0dp" ahora está DEPRECADA .

Siga adelante y use la app:layout_constrainedWidth="true" y android:layout_width="wrap_content" .

La razón de la depreciación, no lo sé. Pero está justo en el código fuente de ConstraintLayout