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!


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)


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

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>

Qu'en est-il d'un ConstraintLayout imbriqué dans un ConstraintLayout, dans votre exemple, changez TextInputLayout en ConstraintLayout?
superutilisateur


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

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.


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

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


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"


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>

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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.