web-dev-qa-db-fra.com

Comment utiliser les nouvelles fonctionnalités dans la disposition de contraintes 1.1?

Quelqu'un sait-il comment utiliser les nouvelles fonctionnalités de la disposition de contraintes 1.1, à savoir les barrières et les dimensions basées sur un pourcentage? Il n'y a absolument aucune documentation disponible en ligne, et les récentes discussions sur les E/S de Google sur les outils de conception ne couvrent en détail que les espaces réservés. BTW, j'ai découvert comment utiliser les groupes, qui sont également une nouvelle fonctionnalité. Vous devez simplement ajouter

<Android.support.constraint.Group
    app:constraint_referenced_ids="button1, button2"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"/>

à votre disposition de contraintes, où app: constraint_referenced_ids est une chaîne, dans laquelle vous devez énumérer les identifiants de vues séparés par des virgules, que vous souhaitez associer à ce groupe. Maintenant, le basculement de la visibilité d'un groupe modifie la visibilité de toutes les vues référencées par lui, ce qui, je pense, est le principal objectif de cette fonctionnalité en ce moment.

20
Roman

Mise à jour: ne version officielle de Constraint Layout 1.1. est enfin là, avec documentation officielle!


Documentation des nouvelles fonctionnalités était très rare lorsque cette question a été posée pour la première fois. Le meilleur que j'ai pu trouver était dans ce post Reddit ! Mais les informations qu'il contient m'ont donné suffisamment d'indices pour créer une disposition de contraintes avec une barrière horizontale. Cela a réellement fonctionné, et la nouvelle disposition des contraintes (bêta) a également corrigé de mauvais problèmes avec wrap_content. Ma première impression très positive de la bêta de mise en page de contraintes a résisté à de nombreux tests supplémentaires.

Avant d'utiliser le nouveau contenu, ajoutez ConstraintLayout 1.1.0 Au projet.

Dans app/build.gradle, changez la dépendance de la disposition des contraintes comme suit:

implementation 'com.Android.support.constraint:constraint-layout:1.1.0'

Vous devrez peut-être également ajouter le référentiel maven à build.gradle de votre projet (qui est un fichier différent, dans le répertoire racine de votre projet). Cherchez le référentiels allprojects et ajoutez ceci: maven { url 'https://maven.google.com' } Donc, la section entière devrait ressembler à ceci:

allprojects {
     repositories {
         jcenter()
         maven { url 'https://maven.google.com' }
     }
}

Maintenant pour les trucs amusants! L'extrait de code suivant crée un barrière horizontale, de sorte que bottom_textview soit inférieur à la fois included_layout et multiline_textview.

<Android.support.constraint.Barrier
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:id="@+id/barrier1"
    app:barrierDirection="bottom"
    app:constraint_referenced_ids="included_layout, multiline_textview" />

<TextView
    Android:id="@+id/bottom_textview"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/barrier1"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content" />

Première impression: les barrières sont super! Ma nouvelle mise en page est plus plate et plus simple, et semble toujours faire exactement ce que je veux. Cela vaut vraiment la peine d'essayer.

Une documentation plus détaillée devient progressivement disponible:

La réponse de @ Vyacheslav A contient également un excellent résumé de ce que les nouvelles fonctionnalités peuvent faire.

29

1. Dimensions en pourcentage

Le comportement par défaut des widgets de largeur 0dp (ou match_constraint) est réparti (configurable via la propriété layout_constraintWidth_default). Dans ConstraintLayout 1.0.x, nous avions le choix de le changer pour envelopper, et dans 1.1.x, nous avons une nouvelle valeur, pour cent, qui nous permet de définir un widget pour prendre un certain pourcentage de l'espace disponible.

    <!-- the widget will take 40% of the available space -->
    app:layout_constraintWidth_default="percent"
    app:layout_constraintWidth_percent="0.4"

2. Obstacles

De ce nouveau widget, nous avons un exemple de ConstraintLayout.com. Les barrières éviteront qu'un ou plusieurs widgets contournent la barrière. Lorsque cela se produit, la barrière se déplace d'elle-même et évite de placer le ou les widgets au-dessus d'elle. Dans l'exemple ci-dessous, la propriété end de text1 et text2 ne peut pas contourner la barrière. Lorsque cela se produit, la barrière se déplace vers la droite (ou vers la gauche, si elle est dans une disposition RTL). Ceci est particulièrement utile lorsqu'il s'agit de différentes tailles de widget, en fonction de certaines configurations ou de l'internationalisation.

<Android.support.constraint.ConstraintLayout...>
  <TextView
    Android:id="@+id/text1" ... />
  <TextView
    Android:id="@+id/text2" ... />
  <Android.support.constraint.Barrier
    Android:id="@+id/barrier"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    app:barrierDirection="end" <!-- start, top, bottom, right... -->
    app:constraint_referenced_ids="text1,text2" />
  <TextView
    Android:id="@+id/text3"
    ...
    app:layout_constraintStart_toEndOf="@+id/barrier" />
</Android.support.constraint.ConstraintLayout>

3. Groupe

Les groupes, comme les directives, sont des widgets de taille 0. Mais le groupe permet d'appliquer une action à un ensemble de widgets. Le cas le plus courant est de contrôler la visibilité d'une collection de widgets. Face à ce scénario, la solution la plus courante était de maintenir vous-même une liste ou un ensemble de vues à l'intérieur de l'activité ou du fragment, ou même d'ajouter un ViewGroup et de placer toutes les vues à l'intérieur de celui-ci, en contrôlant la visibilité du conteneur. Maintenant, il vous suffit d'ajouter leurs identifiants au groupe, et le groupe propagera les actions à toutes les vues connectées.

<Android.support.constraint.ConstraintLayout ...>
  <TextView
    Android:id="@+id/text1" ... />
  <TextView
    Android:id="@+id/text2" ... />
  <Android.support.constraint.Group
    Android:id="@+id/group"
    ...
    app:constraint_referenced_ids="text1,text2" />
</Android.support.constraint.ConstraintLayout>

Dans ce cas, si nous appelons

group.setVisibility(View.GONE);

alors text1 et text2 recevront la visibilité GONE.

Original texte ici .

Documents officiels avec description ici.

18
Vyacheslav A

Voici le doc officiel qui explique parfaitement toutes les nouvelles fonctionnalités ajoutées dans la disposition des contraintes 1.1

Mais une autre chose à noter pour Groupes est que si vous donnez votre vue comme identifiant de référence dans Groupe, sa visibilité individuelle ne fonctionnera pas, pour que cela vous aurez besoin de créer un groupe distinct pour cela. Corrigez-moi si je me trompe. Voici l'exemple de code qui utilise Group , comme vous pouvez le voir ici view1's la visibilité ne fonctionnera pas car elle est affectée à un groupe.

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

    <Android.support.constraint.Group
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:visibility="visible"
        app:constraint_referenced_ids="view1,view2" />

    <View
        Android:id="@+id/view1"
        Android:layout_width="match_parent"
        Android:layout_height="100dp"
        Android:background="@Android:color/black"
        Android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <View
        Android:id="@+id/view2"
        Android:layout_width="match_parent"
        Android:layout_height="100dp"
        Android:background="@Android:color/darker_gray"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view1" />

    <View
        Android:id="@+id/view3"
        Android:layout_width="match_parent"
        Android:layout_height="100dp"
        Android:background="@Android:color/holo_blue_light"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view2" />

    <View
        Android:id="@+id/view4"
        Android:layout_width="match_parent"
        Android:layout_height="100dp"
        Android:background="@Android:color/holo_red_light"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view3" />

</Android.support.constraint.ConstraintLayout>

Maintenant, pour surmonter cela, nous pouvons créer un nouveau groupe pour gérer la visibilité de view1, comme indiqué ci-dessous.

<Android.support.constraint.Group
       Android:layout_width="wrap_content"
       Android:layout_height="wrap_content"
       app:constraint_referenced_ids="view1" />

C'est la solution de contournement que j'ai rencontrée, s'il y a un tel scénario où nous voulons gérer la visibilité d'un groupe ainsi que la visibilité d'une vue individuelle dans différents cas.

1
Darshna Desai

Il y a quelques informations sur Barrière ici .

1
J. Parker