J'ai besoin d'appliquer quelques contraintes à un groupe de vues dans ConstraintLayout
. Je souhaite regrouper ces vues et continuer à les modifier pendant que le concepteur de mise en page dans Android studio les traite comme une seule vue. Y a-t-il un moyen de le faire sans envelopper les vues avec un ViewGroup
(une autre mise en page)? Si un tel wrapper est nécessaire, peut-être y a-t-il une mise en page de wrapper qui vient avec ConstraintLayout
et permet de regrouper des objets sans créer de mises en page lourdes comme RelativeLayout
?
Les développeurs Android ont récemment publié une nouvelle version de ConstraintLayout
( 1.0.2 à partir d'aujourd'hui). Cette version contient une nouvelle fonctionnalité majeure - Chaînes , qui nous permet de regrouper les vues dans ConstraintLayout
.
Les chaînes offrent un comportement de type groupe sur un seul axe (horizontalement ou verticalement).
Un ensemble de widgets sont considérés comme une chaîne s'ils sont liés entre eux via une connexion bidirectionnelle
Une fois qu'une chaîne est créée, il y a deux possibilités:
- Répartissez les éléments dans l'espace disponible
- Une chaîne peut également être "emballée", dans ce cas les éléments sont regroupés
Actuellement, vous devez utiliser la dépendance Gradle suivante pour utiliser cette fonctionnalité (car il s'agit d'un alpha):
compile 'com.Android.support.constraint:constraint-layout:1.0.0-alpha9'
Ici vous pouvez trouver la dernière version de ConstraintLayout
à utiliser dans vos projets.
Jusqu'à Android Studio 2. , Android Le concepteur d'interface utilisateur de Studio ne prenait pas en charge la création de chaînes car vous ne pouviez pas y ajouter de contraintes bidirectionnelles. La solution était de créer ces contraintes en XML manuellement, comme mentionné par TranslucentCloud . À partir de Android Studio 2.3 (actuellement uniquement sur le canal canari), les chaînes sont également prises en charge dans un éditeur d'interface utilisateur (comme - GoRoS mentionné dans les commentaires).
Voici un exemple montrant comment positionner deux vues ensemble au milieu d'un écran en utilisant les chaînes ConstraintLayout
et :
<?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"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:id="@+id/textView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginEnd="16dp"
Android:layout_marginStart="16dp"
Android:layout_marginTop="16dp"
Android:text="TextView"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.5"
app:layout_constraintVertical_chainPacked="true"/>
<Button
Android:id="@+id/button"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginBottom="16dp"
Android:layout_marginEnd="16dp"
Android:layout_marginStart="16dp"
Android:layout_marginTop="8dp"
Android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"/>
</Android.support.constraint.ConstraintLayout>
Dans les versions récentes, vous devez utiliser app:layout_constraintVertical_chainStyle="packed"
au lieu de app:layout_constraintVertical_chainPacked="true"
Vous pouvez utiliser
Android.support.constraint.Guideline
pour regrouper des éléments.
Ajoutez une ligne directrice (verticale ou horizontale), puis utilisez-la comme point d'ancrage pour les autres vues. Voici un exemple simple de centrage horizontal de deux vues de texte groupées: (montrant la vue de conception dans AS)
<?xml version="1.0" encoding="utf-8"?>
<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="56dp"
Android:background="@Android:color/white"
Android:paddingLeft="16dp"
Android:paddingRight="16dp">
<TextView
Android:id="@+id/top_text"
Android:layout_width="wrap_content"
Android:layout_height="0dp"
Android:background="@Android:color/holo_red_light"
Android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@+id/guideline"
Android:text="Above"
tools:text="Above" />
<Android.support.constraint.Guideline
Android:id="@+id/guideline"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5" />
<TextView
Android:id="@+id/bottom_text"
Android:layout_width="wrap_content"
Android:layout_height="0dp"
Android:background="@Android:color/holo_blue_bright"
Android:textSize="16sp"
app:layout_constraintTop_toBottomOf="@+id/guideline"
Android:text="Below"
tools:text="Below" />
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_vertical"
Android:text="Right vertically centered"
Android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Right vertically centered"/>
</ConstraintLayout>
Je veux juste ajouter quelques graphiques à la grande réponse acceptée. C'est très simple:
Dans la vue de conception de disposition> sélectionnez toutes les vues que vous souhaitez regrouper> cliquez dessus avec le bouton droit> Chaînes> Créer une chaîne horizontale:
Il est également simple de les centrer:
Sélectionnez la vue head du groupe> Organize> Pack Horizontally> définissez la contrainte de début de la première vue et la contrainte de fin de la dernière vue sur leur parent :