J'essaie d'implémenter une simple bulle de discussion en utilisant un fichier ConstraintLayout
. C'est ce que j'essaye de réaliser:
Cependant, wrap_content
semblent ne pas fonctionner correctement avec les contraintes. Il respecte les marges, mais ne calcule pas correctement l'espace disponible. Voici ma mise en page:
<?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>
Cela se traduit comme suit:
J'utilise com.android.support.constraint:constraint-layout:1.0.0-beta4
.
Est-ce que je fais quelque chose de mal? Est-ce un bug ou simplement un comportement peu intuitif? Puis-je obtenir le bon comportement en utilisant un ConstraintLayout
(je sais que je peux utiliser d'autres mises en page, je pose la question ConstrainLayout
spécifiquement).
android
android-layout
android-constraintlayout
Marcin Jedynak
la source
la source
tools:background="@drawable/chat_message_bubble"
. Pour l'implémenter, vous devez créer le fichier chat_message_bubble.xml dans le dossier drawable puis ajouter ce code:<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FB4382"/> <corners android:radius="10dip"/> </shape>
Réponses:
Obsolète: voir une meilleure réponse
Non, vous ne pouvez pas faire ce que vous voulez avec ConstraintLayout tel qu'il est aujourd'hui (1.0 beta 4):
wrap_content
demande seulement au widget de se mesurer, mais ne limitera pas son expansion contre d'éventuelles contraintesmatch_constraints
(0DP) va limiter la taille du widget contre les contraintes ... mais les jumellera même siwrap_content
aurait été plus petit (votre premier exemple), ce qui est pas ce que vous voulez soit.Alors maintenant, vous n'avez pas de chance pour ce cas particulier: - /
Maintenant ... nous pensons ajouter des capacités supplémentaires pour
match_constraints
faire face à ce scénario exact (se comporter comme àwrap_content
moins que la taille ne soit plus que les contraintes).Je ne peux cependant pas promettre que cette nouvelle fonctionnalité sera disponible avant la version 1.0.
Edit : nous avons ajouté cette capacité dans 1.0 avec l'attribut
app:layout_constraintWidth_default="wrap"
(avec une largeur définie à 0dp). S'il est défini, le widget aura la même taille que s'il utilisait wrap_content, mais sera limité par des contraintes (c'est-à-dire qu'il ne s'étendra pas au-delà d'elles)Mettre à jour Maintenant, ces balises sont obsolètes, utilisez à la place layout_width = "WRAP_CONTENT" et layout_constrainedWidth = "true".
la source
match_constraints
le composé, le drawable sera à l'extrême droite, même s'il y a du texte très court.app:layout_constraintWidth_default="wrap"
aussi, et v1.0.2 de la bibliothèque mais ça n'aide pasMis à jour (ConstraintLayout 1.1. +)
Utiliser
app:layout_constrainedWidth="true"
avecandroid:layout_width="wrap_content"
Précédemment (obsolète):
app:layout_constraintWidth_default="wrap"
avecandroid:layout_width="0dp"
la source
Oui, comme mentionné dans la réponse donnée par Nikolas Roard, vous devez ajouter
app:layout_constraintWidth_default="wrap"
et définir la largeur à 0dp. Et pour aligner votre bulle à droite, vous devez définir 1.0 pourlayout_constraintHorizontal_bias
.Voici le code source final:
En conséquence, il ressemble à:
la source
app:layout_constraintHorizontal_bias="1.0"
Comme les autres réponses déjà dites, depuis ConstraintLayout 1.0, il est possible d'y parvenir, mais à partir de la dernière version (1.1.x), ils ont changé la façon dont vous le faites.
Depuis la sortie de ConstraintLayout 1.1, les anciens attributs
app:layout_constraintWidth_default="wrap"
et sont désormais obsolètes .app:layout_constraintHeight_default="wrap"
Si vous souhaitez fournir un
wrap_content
comportement, tout en appliquant les contraintes sur votre vue, vous devez définir sa largeur et / ou sa hauteur surwrap_content
combinées avec les attributsapp:layout_constrainedWidth=”true|false”
et / ouapp:layout_constrainedHeight=”true|false”
, comme indiqué dans la documentation :En ce qui concerne la dernière version, au moment où j'y ai répondu, ConstraintLayout est sur la version 1.1.2 .
la source
La réponse de @ nicolas-roard
app:layout_constraintWidth_default="wrap"
etandroid:layout_width="0dp"
est maintenant DÉPRECÉE .Allez-y et utilisez
app:layout_constrainedWidth="true"
etandroid:layout_width="wrap_content"
.La raison de la dépréciation, je ne sais pas. Mais c'est juste dans le code source de ConstraintLayout
la source
J'utilise celui-ci
la source
Tu devrais remplacer
avec
à partir de votre TextView, puis ajustez le remplissage et la marge en conséquence. J'ai mis à jour votre code,
Vous obtiendrez ce résultat
la source