У чому різниця між бар’єром та керівництвом у макеті обмежень?


93

Нещодавно намагався реалізувати, Constraint Layoutале знайшов Barrierі Guidelineпрацює однаково. Обидва працюють як дільник. Чи є якась різниця між ними?

Відповіді:


202

Коли використовувати бар'єри

Припустимо, у вас є два TextViewвіджети з динамічною висотою, і ви хочете розмістити Buttonтрохи нижче найвищої TextView:

Перегляд завдання

Тільки спосіб здійснити це прямо в макеті, щоб використовувати горизонтальну Barrier. Це Barrierдозволяє вказати обмеження на основі висоти цих двох TextViews. Потім ви обмежуєте верхню частину Buttonнижньої частини горизонталі Barrier.

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

    <android.support.constraint.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" />

</android.support.constraint.ConstraintLayout>

Коли використовувати вказівки

Припустимо, ви хочете обмежити вищезазначені TextViewвисоти до 30% висоти екрану, незалежно від вмісту, який вони мають.

Тестовий вигляд

Щоб реалізувати це, слід додати горизонталь Guidelineіз відсотком позиції та обмежити TextViewнижню частину Guideline.

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

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

</android.support.constraint.ConstraintLayout>

Висновок

Єдина різниця між Barrierі Guidelineполягає в тому Barrier, що позиція 'є гнучкою і завжди заснована на розмірі декількох елементів інтерфейсу, що містяться в ній, і Guidelineпозиція' завжди фіксована.


цінна відповідь!
Аліреза Нооралі

Претензія: "ЄДИНИМ способом реалізації цього безпосередньо в макеті є використання горизонтальної перешкоди." є хибним. Ви можете використати для цього орієнтир, встановивши обидва текстові поля внизу орієнтиром. (Тобтоapp:layout_constraintBottom_toTopOf="@id/guideline"
Крісфер

11

Офіційна документація про бар'єр :

Бар’єр посилається на кілька віджетів як на вхідні дані та створює віртуальну орієнтир на основі найекстремальнішого віджету на зазначеній стороні. Наприклад, лівий бар'єр буде вирівнюватися ліворуч від усіх згаданих видів.

Навчальні документи з бар’єру :

Подібно до орієнтиру, бар’єр - це невидима лінія, на яку ви можете обмежити види. За винятком того, що бар'єр не визначає власне положення; натомість, бар’єрна позиція рухається на основі позиції поглядів, що містяться в ній. Це корисно, коли ви хочете обмежити подання набором подань, а не одним конкретним видом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.