Stellen Sie die Breite so ein, dass sie den Einschränkungen in ConstraintLayout entspricht


96

Ich möchte die linke und rechte Seite einer Ansicht auf die Ränder der übergeordneten Ansicht beschränken und sie den zugewiesenen Bereich ausfüllen lassen. Wenn Sie jedoch die Breite entweder auf match_parentoder einstellen wrap_content, wird das gleiche Ergebnis erzielt.

Gibt es etwas Äquivalentes zu match_constraints (im Gegensatz zu match_parent und wrap_content)? Haben match_parentund wrap_contentbeeinflussen das Layout oder werden sie in der neuen Einschränkung Layout ignoriert?

Ich liebe dieses neue Layoutsystem für meine Lieblingsplattform!


1
Warum match_parentfunktioniert das bei dir nicht?
Eugen Martynov

Antworten:


119

match_parentwird nicht unterstützt. Mit 0dpkönnen Sie sich Ihre Einschränkungen als "skalierbar" vorstellen, anstatt "zu füllen, was noch übrig ist".

Auch 0dpkann durch eine Position definiert werden, wobei match_parentauf seine Eltern angewiesen für seine Position (x, y und Breite, Höhe)


31
Warum wird diese Antwort akzeptiert?!? match_parent wird vom Einschränkungslayout nicht unterstützt. Und diese Antwort gibt keine Möglichkeit, sie umzusetzen.
Daniele Segato

3
match_parent wird nicht unterstützt.
Nicolas Roard

7
Diese Antwort ist richtig. Es wird eindeutig angegeben, dass match_parent nicht unterstützt wird. Um eine sinnvolle Alternative zu einer Einstellung 'match_parent' zu erzielen, liefert 0dp mit Einschränkungen, die links und rechts auf übergeordnet festgelegt sind (Rand 0 oder Auswahl entsprechend), dasselbe Ergebnis. Das einzige, was in dieser Antwort, die in Ariecks Antwort enthalten ist, wirklich ausgelassen wurde, ist die Notwendigkeit, Einschränkungen auf beiden Seiten festzulegen (oder oben und unten für vertikal). So mache ich das und ich hatte keine Probleme. Außerdem funktioniert es als Gewichtseinstellung, wenn es mit anderen Komponenten verwendet wird.
Tequilaman

Wenn jemand hierher kommt und nach einer Antwort sucht, funktioniert das nicht. Es scheint, dass es in der Beta kaputt gegangen ist. Es scheint in 1.0.2 zu funktionieren. Lektion gelernt - Frieren Sie die Bibliotheken ein, verwenden Sie keine opportunistischen Updates.
Inteist

1
@ Tequilaman Kommentar kann die Antwort sein. Er hat zu Recht darauf hingewiesen, wie dies umgesetzt werden kann. Erstellen Sie auf beiden Seiten eine Einschränkung mit einem Rand von 0 dp.
Utkarsh Mankad

167

match_parentist nicht erlaubt. Sie können jedoch Breite und Höhe auf 0 dp setzen und entweder die oberen und unteren oder die linken und rechten Einschränkungen auf "übergeordnet" setzen.

Wenn Sie beispielsweise die match_parentEinschränkung für die Breite des Elements festlegen möchten , können Sie dies folgendermaßen tun:

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>

4
Das Android-Team sollte dafür sorgen, dass "match_parent" funktioniert. Es wäre sehr einfach. Lassen Sie match_parent einfach die gleiche Funktionalität bereitstellen, als ob die App auf den Start und das Ende des übergeordneten Elements beschränkt wäre. Wäre leicht vertikal oder horizontal zu erkennen.
Bharv14

Aber führt 0dp nicht zu einem Doppelmaß?
Pramod Garg

25

Anscheinend match_parentist:

  • NICHT OK für Ansichten direkt unterConstraintLayout
  • OK für Ansichten, die in Ansichten verschachtelt sind, die sich direkt darunter befindenConstraintLayout

Wenn Sie also Ihre Ansichten benötigen, um als zu funktionieren match_parent, dann:

  1. Direkte Kinder von ConstraintLayoutverwenden sollten0dp
  2. Verschachtelte Elemente (z. B. Enkel von ConstraintLayout) können verwendet werdenmatch_parent

Beispiel:

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

Was ist mit einem in einem ConstraintLayout verschachtelten ConstraintLayout? Ändern Sie in Ihrem Beispiel TextInputLayout in ein ConstraintLayout?
Superuser

16

match_parentwird nicht unterstützt von ConstraintLayout. Stellen Sie die Breite auf ein 0dp, damit sie den Einschränkungen entspricht.


und wrap_content wird unterstützt?
KG6ZVP

Ja, soweit ich das beurteilen kann.
Marcin Koziński

6
wrap_content wird unterstützt
Romain Guy

13

Aus dem offiziellen Dokument :

Wichtig: MATCH_PARENT wird für Widgets in einem ConstraintLayout nicht empfohlen. Ein ähnliches Verhalten kann mithilfe von MATCH_CONSTRAINT definiert werden, wobei die entsprechenden Einschränkungen für links / rechts oder oben / unten auf "übergeordnet" gesetzt werden.

Wenn Sie also einen MATCH_PARENTEffekt erzielen möchten , können Sie dies tun:

<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

Sie können Ihren Adapter überprüfen.

 1 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);
 2 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false);

Ich hatte das gleiche Problem wie Sie, als ich 1 verwendet habe. Sie können 2 versuchen.


Das ist Gold! Danke dir!
Grrigore

3

Das Erstellen Ihrer Ansicht als match_parent ist nicht direkt möglich, aber wir können dies auf eine etwas andere Art und Weise tun. Vergessen Sie jedoch nicht, das Attribut Left und Right mit Start und End zu verwenden. Wenn Sie RTL-Unterstützung verwenden, wird dies benötigt.

    <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

Stellen Sie Breite oder Höhe (was auch immer Sie benötigen, um mit dem übergeordneten Element übereinzustimmen) auf 0dp ein und legen Sie die Ränder von links, rechts, oben und unten fest, um als übereinstimmendes übergeordnetes Element zu fungieren


1

im Bürodokument: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

Wenn eine Dimension auf MATCH_CONSTRAINT festgelegt ist, besteht das Standardverhalten darin, dass die resultierende Größe den gesamten verfügbaren Speicherplatz einnimmt.

Verwendung von 0dp, was "MATCH_CONSTRAINT" entspricht

Wichtig: MATCH_PARENT wird für Widgets in einem ConstraintLayout nicht empfohlen. Ein ähnliches Verhalten kann mithilfe von MATCH_CONSTRAINT definiert werden, wobei die entsprechenden Einschränkungen für links / rechts oder oben / unten auf "übergeordnet" gesetzt werden.


0

Wenn Sie TextView in der Mitte des übergeordneten Elements möchten.
Ihr Hauptlayout ist Constraint Layout

<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

Ich habe eine weitere Antwort gefunden, wenn es in der Bildlaufansicht ein Einschränkungslayout gibt, das wir dann einfügen müssen

android:fillViewport="true"

zur Bildlaufansicht

und

android:layout_height="0dp"

im Einschränkungslayout

Beispiel:

<?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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.