Constraint Layout
Ich habe kürzlich versucht zu implementieren, aber ich habe gefunden Barrier
und Guideline
funktioniert gleich. Beides funktioniert wie ein Teiler. Gibt es einen Unterschied zwischen ihnen?
Constraint Layout
Ich habe kürzlich versucht zu implementieren, aber ich habe gefunden Barrier
und Guideline
funktioniert gleich. Beides funktioniert wie ein Teiler. Gibt es einen Unterschied zwischen ihnen?
Antworten:
Angenommen, Sie haben zwei TextView
Widgets mit dynamischen Höhen und möchten eine Button
direkt unter der höchsten platzieren TextView
:
Die einzige Möglichkeit, dies direkt im Layout zu implementieren, ist die Verwendung einer Horizontalen Barrier
. Auf diese Weise Barrier
können Sie eine Einschränkung basierend auf der Höhe dieser beiden TextView
s angeben . Dann beschränken Sie die Oberseite Ihrer Button
auf die Unterseite der Horizontalen 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>
Angenommen, Sie möchten die oben genannten TextView
Höhen auf 30% der Bildschirmhöhe beschränken, unabhängig vom Inhalt.
Um dies zu implementieren, sollten Sie horizontal Guideline
mit prozentualer Position hinzufügen und den TextView
unteren Rand darauf beschränken 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>
Der einzige Unterschied zwischen Barrier
und Guideline
besteht darin, dass Barrier
die Position flexibel ist und immer auf der Größe mehrerer darin enthaltener UI-Elemente basiert und Guideline
die Position immer fest ist.
app:layout_constraintBottom_toTopOf="@id/guideline"
Offizielle Dokumentation zu Barrier :
Eine Barriere verweist auf mehrere Widgets als Eingabe und erstellt eine virtuelle Richtlinie, die auf dem extremsten Widget auf der angegebenen Seite basiert. Beispielsweise wird eine linke Barriere links von allen referenzierten Ansichten ausgerichtet.
Schulungsunterlagen zu Barrier :
Ähnlich wie bei einer Richtlinie ist eine Barriere eine unsichtbare Linie, auf die Sie Ansichten beschränken können. Außer eine Barriere definiert nicht ihre eigene Position; Stattdessen bewegt sich die Barriereposition basierend auf der Position der darin enthaltenen Ansichten. Dies ist nützlich, wenn Sie eine Ansicht auf eine Reihe von Ansichten und nicht auf eine bestimmte Ansicht beschränken möchten.