Définir la largeur pour correspondre aux contraintes dans ConstraintLayout

97

Je voudrais contraindre les côtés gauche et droit d'une vue aux marges de la vue parent et la faire remplir l'espace alloué. Cependant, définir la largeur sur match_parentou wrap_contentsemble produire le même résultat.

Y a-t-il quelque chose d'équivalent à match_constraints (par opposition à match_parent et wrap_content)? Affectent-ils match_parentet wrap_contentaffectent-ils la disposition ou sont-ils ignorés dans la nouvelle disposition des contraintes?

J'adore ce nouveau système de mise en page pour ma plate-forme préférée!

KG6ZVP
la source
1
Pourquoi match_parentne fonctionne pas pour vous?
Eugen Martynov

Réponses:

120

match_parentn'est pas pris en charge. Avec 0dp, vous pouvez considérer vos contraintes comme «évolutives» plutôt que comme «remplissant ce qui reste».

En outre, 0dppeut être défini par une position, où match_parentrepose sur son parent pour sa position (x, y et largeur, hauteur)

brob
la source
31
pourquoi cette réponse acceptée?!? match_parent n'est pas pris en charge par la disposition des contraintes. Et cette réponse ne donne aucun moyen de la mettre en œuvre.
Daniele Segato
3
match_parent n'est pas pris en charge.
Nicolas Roard
7
Cette réponse est correcte. Il indique clairement que match_parent n'est pas pris en charge. De plus, pour effectuer une alternative raisonnable à un paramètre 'match_parent', 0dp avec des contraintes définies sur parent à gauche et à droite (marge 0 ou choix en fonction) donnera le même résultat. La seule chose qui a vraiment été laissée de côté dans cette réponse, qui est la réponse d'Arieck, est la nécessité de définir des contraintes des deux côtés (ou en haut et en bas pour la verticale). C'est comme ça que je fais et je n'ai eu aucun problème. De plus, il fonctionne comme un paramètre de poids lorsqu'il est utilisé avec d'autres composants.
Tequilaman
Si quelqu'un vient ici chercher la réponse, cela ne fonctionne pas. Il semble qu'il ait été cassé en version bêta. Cela semble fonctionner dans la version 1.0.2. Leçon apprise - gelez les bibliothèques, n'utilisez pas de mises à jour opportunistes.
inteist
1
Le commentaire @Tequilaman peut être la réponse. Il a indiqué à juste titre la manière de le mettre en œuvre. Créez une contrainte de chaque côté avec une marge de 0dp, cela fait l'affaire.
Utkarsh Mankad
168

match_parentn'est pas autorisé. Mais vous pouvez en fait définir la largeur et la hauteur sur 0dp et définir les contraintes supérieure et inférieure ou gauche et droite sur "parent".

Donc par exemple si vous voulez avoir la match_parentcontrainte sur la largeur de l'élément, vous pouvez le faire comme ceci:

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>
Arieck
la source
4
L'équipe Android devrait faire fonctionner "match_parent". Ce serait extrêmement facile. Faites simplement en sorte que match_parent fournisse la même fonctionnalité que si l'application était contrainte au début et à la fin du parent. Serait facile à détecter verticalement ou horizontalement.
bharv14
Mais 0dp n'entraîne-t-il pas une double mesure?
Pramod Garg
25

Apparemment, match_parentc'est:

  • PAS OK pour les vues directement sousConstraintLayout
  • OK pour les vues imbriquées à l'intérieur de vues qui sont directement sousConstraintLayout

Donc, si vous avez besoin que vos vues fonctionnent comme match_parent, alors:

  1. Les enfants directs de ConstraintLayoutdevraient utiliser0dp
  2. Les éléments imbriqués (par exemple, petit-enfant de ConstraintLayout) peuvent utilisermatch_parent

Exemple:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="16dp">

    <android.support.design.widget.TextInputLayout
        android:id="@+id/phoneNumberInputLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/phoneNumber"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    </android.support.design.widget.TextInputLayout>
Gene Bo
la source
Qu'en est-il d'un ConstraintLayout imbriqué dans un ConstraintLayout, dans votre exemple, changez TextInputLayout en ConstraintLayout?
superutilisateur
16

match_parentn'est pas pris en charge par ConstraintLayout. Définissez la largeur sur 0dppour qu'elle corresponde aux contraintes.

Marcin Koziński
la source
et wrap_content est pris en charge?
KG6ZVP
Oui, pour autant que je sache.
Marcin Koziński
6
wrap_content is supported
Romain Guy
13

Du doc officiel :

Important: MATCH_PARENT n'est pas recommandé pour les widgets contenus dans un ConstraintLayout. Un comportement similaire peut être défini en utilisant MATCH_CONSTRAINT avec les contraintes gauche / droite ou haut / bas correspondantes définies sur "parent".

Donc, si vous voulez obtenir un MATCH_PARENTeffet, vous pouvez le faire:

<TextView
    android:id="@+id/textView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="TextView"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />
xymelon
la source
4

Vous pouvez vérifier votre adaptateur.

 1 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);
 2 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false);

J'ai eu le même problème que vous lorsque j'utilisais 1. Vous pouvez essayer 2.

Kim Jeong woo
la source
C'est de l'or! Je vous remercie!
grrigore
3

Pour rendre votre vue en tant que match_parent n'est pas possible directement, mais nous pouvons le faire d'une manière un peu différente, mais n'oubliez pas d'utiliser l'attribut Gauche et Droite avec Début et Fin, car si vous utilisez le support RTL, il sera nécessaire.

    <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
Shubham Santuwala
la source
2

définir la largeur ou la hauteur (tout ce dont vous avez besoin pour correspondre au parent) à 0dp et définir les marges de gauche, droite, haut, bas pour agir comme parent correspondant

santhosh
la source
1

dans le bureau doc: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

Lorsqu'une dimension est définie sur MATCH_CONSTRAINT, le comportement par défaut consiste à faire en sorte que la taille résultante occupe tout l'espace disponible.

Utilisation de 0dp, qui est l'équivalent de "MATCH_CONSTRAINT"

Important: MATCH_PARENT n'est pas recommandé pour les widgets contenus dans un ConstraintLayout. Un comportement similaire peut être défini en utilisant MATCH_CONSTRAINT avec les contraintes gauche / droite ou haut / bas correspondantes définies sur "parent"

Chuanxing Zhao
la source
0

Si vous voulez que TextView soit au centre du parent ..
Votre mise en page principale est Mise en page de contrainte

<androidx.appcompat.widget.AppCompatTextView
     android:layout_width="0dp"
     android:layout_height="wrap_content"
     android:text="@string/logout"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     android:gravity="center">
</androidx.appcompat.widget.AppCompatTextView>
khyati naik
la source
0

J'ai trouvé une autre réponse lorsqu'il y a une disposition de contrainte à l'intérieur de la vue de défilement, alors nous devons mettre

android:fillViewport="true"

à la vue de défilement

et

android:layout_height="0dp"

dans la disposition des contraintes

Exemple:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
        android:fillViewport="true">

    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="0dp">

// Rest of the views

</androidx.constraintlayout.widget.ConstraintLayout>

</ScrollView>
Sneha Mudhigonda
la source