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