157 votes

Quelle est la différence entre la barrière et la ligne directrice dans la mise en page des contraintes ?

Récemment, nous avons essayé de mettre en œuvre Constraint Layout mais j'ai trouvé Barrier y Guideline fonctionne de la même manière. Les deux fonctionnent comme des séparateurs. Y a-t-il une différence entre les deux ?

365voto

Eugene Brusov Points 4196

Quand utiliser les barrières

Supposons que vous ayez deux TextView avec des hauteurs dynamiques et que vous souhaitez placer un widget Button juste en dessous de la plus haute TextView :

Task view

En UNIQUEMENT La façon de mettre cela en œuvre directement dans la mise en page est d'utiliser un Barrier . Cette Barrier vous permet de spécifier une contrainte basée sur la hauteur de ces deux TextView s. Ensuite, vous contraignez le haut de votre Button au bas de l'horizontale Barrier .

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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/left_text_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        android:textSize="16sp"
        android:background="#AAA"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/right_text_view"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/right_text_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:text="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
        android:textSize="16sp"
        android:background="#DDD"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/left_text_view"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.constraintlayout.widget.Barrier
        android:id="@+id/barrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="bottom"
        app:constraint_referenced_ids="left_text_view,right_text_view" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/barrier" />

</androidx.constraintlayout.widget.ConstraintLayout>

Quand utiliser les lignes directrices

Supposons que vous souhaitiez restreindre l'utilisation de la fonction TextView à 30 % de la hauteur de l'écran, quel que soit leur contenu.

Test view

Pour ce faire, il convient d'ajouter des Guideline avec la position en pourcentage et contraindre le TextView en bas de cette page Guideline .

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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/left_text_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:background="#AAA"
        android:text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        android:textSize="16sp"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toStartOf="@+id/right_text_view"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/right_text_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:background="#DDD"
        android:text="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
        android:textSize="16sp"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/left_text_view"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.3" />

</androidx.constraintlayout.widget.ConstraintLayout>

Conclusion

La seule différence entre Barrier y Guideline est que Barrier est flexible et toujours basée sur la taille des multiples éléments de l'interface utilisateur qu'elle contient. Guideline est toujours fixe.

6 votes

Une réponse précieuse !

0 votes

L'affirmation : "La SEULE façon d'appliquer cela directement dans la mise en page est d'utiliser une barrière horizontale" est fausse. Vous pouvez utiliser une ligne directrice pour cela, en faisant en sorte que les deux zones de texte soient limitées en dessous par une ligne directrice. (Par exemple app:layout_constraintBottom_toTopOf="@id/guideline"

0 votes

Qu'advient-il de la barrière lorsque la visibilité des vues de référence disparaît ? ?

21voto

dominicoder Points 2315

Documentation officielle sur la barrière :

Une barrière fait référence à plusieurs widgets en tant qu'entrée et crée une ligne directrice virtuelle basée sur le widget le plus extrême du côté spécifié. Par exemple, une barrière gauche s'alignera sur la gauche de toutes les vues référencées.

Documents de formation sur la barrière :

À l'instar d'une ligne directrice, une barrière est une ligne invisible à laquelle vous pouvez limiter les vues. Toutefois, une barrière ne définit pas sa propre position ; au lieu de cela, la position de la barrière se déplace en fonction de la position des vues qu'elle contient. Ceci est utile lorsque vous souhaitez contraindre une vue à un ensemble de vues plutôt qu'à une vue spécifique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X