Ustaw szerokość, aby dopasować ograniczenia w ConstraintLayout


98

Chciałbym ograniczyć lewą i prawą stronę widoku do marginesów widoku nadrzędnego i sprawić, by wypełnił przydzieloną przestrzeń. Jednakże ustawienie szerokości do albo match_parentlub wrap_contentwydaje się ten sam wynik.

Czy istnieje coś równoważnego match_constraints (w przeciwieństwie do match_parent i wrap_content)? Czy match_parenti wrap_contentwpływają na układ, czy też są ignorowane w nowym układzie ograniczeń?

Uwielbiam ten nowy system układu dla mojej ulubionej platformy!


1
Dlaczego match_parentnie działa dla Ciebie?
Eugen Martynov

Odpowiedzi:


126

match_parentnie jest wspierany. W programie 0dpmożesz myśleć o swoich ograniczeniach jako o „skalowalnych”, a nie „wypełniających to, co zostało”.

Ponadto, 0dpmoże być określony przez położenie, w którym match_parentopiera się na jego rodzica w swojej pozycji (x, y, szerokość, wysokość)


31
dlaczego jest to akceptowana odpowiedź?!? match_parent nie jest obsługiwany przez układ ograniczeń. A ta odpowiedź nie daje możliwości jej wdrożenia.
Daniele Segato,

3
match_parent nie jest obsługiwany.
Nicolas Roard

7
Ta odpowiedź jest poprawna. Wyraźnie stwierdza się, że funkcja match_parent nie jest obsługiwana. Ponadto, aby wykonać rozsądną alternatywę dla ustawienia `` match_parent '', 0dp z ograniczeniami ustawionymi na rodzica po lewej i prawej stronie (margines 0 lub wybierz do koloru) da ten sam wynik. Jedyną rzeczą, która została tak naprawdę pominięta w tej odpowiedzi, która znajduje się w odpowiedzi Ariecka, jest potrzeba ustawienia ograniczeń po obu stronach (lub na górze i na dole w przypadku pionu). Tak to robię i nie miałem żadnych problemów. Dodatkowo działa jako ustawienie wagi, gdy jest używany z innymi komponentami.
Eric Engel

Jeśli ktoś tu przyjdzie, szukając odpowiedzi, to nie działa. Wygląda na to, że został uszkodzony w wersji beta. Wydaje się, że działa w wersji 1.0.2. Wyciągnięta lekcja - zamrażaj biblioteki, nie używaj oportunistycznych aktualizacji.
inteist

1
Odpowiedzią może być komentarz @Tequilaman. Słusznie wskazał sposób jego realizacji. Utwórz ograniczenie po obu stronach z marginesem 0dp, to załatwia sprawę.
Utkarsh Mankad

170

match_parentnie jest dozwolone. Ale w rzeczywistości możesz ustawić szerokość i wysokość na 0dp i ustawić górne i dolne lub lewe i prawe ograniczenia na „rodzica”.

Na przykład, jeśli chcesz mieć match_parentograniczenie na szerokość elementu, możesz to zrobić w ten sposób:

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

4
Zespół Androida powinien sprawić, że „match_parent” zadziała. To byłoby niezwykle łatwe. Po prostu spraw, aby funkcja match_parent zapewniała taką samą funkcjonalność, jak gdyby aplikacja była ograniczona do początku i końca elementu nadrzędnego. Byłby łatwy do wykrycia w pionie lub w poziomie.
bharv14

Ale czy 0dp nie daje podwójnego pomiaru?
Pramod Garg

25

Najwyraźniej match_parentjest:

  • NIE OK dla widoków bezpośrednio podConstraintLayout
  • OK w przypadku widoków zagnieżdżonych w widokach znajdujących się bezpośrednio podConstraintLayout

Jeśli więc chcesz, aby Twoje widoki funkcjonowały jako match_parent, to:

  1. Bezpośrednie dzieci od ConstraintLayoutpowinni stosować0dp
  2. Zagnieżdżone elementy (np. Wnuk do ConstraintLayout) mogą używaćmatch_parent

Przykład:

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

A co z ConstraintLayout zagnieżdżonym w ConstraintLayout, w twoim przykładzie zmień TextInputLayout na ConstraintLayout?
superuser


13

Z oficjalnego dokumentu :

Ważne: MATCH_PARENT nie jest zalecany w przypadku widżetów zawartych w ConstraintLayout. Podobne zachowanie można zdefiniować za pomocą MATCH_CONSTRAINT z odpowiednimi ograniczeniami lewo / prawo lub góra / dół ustawionymi na „rodzic”.

Jeśli więc chcesz osiągnąć MATCH_PARENTefekt, możesz to zrobić:

<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

Możesz sprawdzić swój adapter.

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

Miałem taki sam problem jak Ty, kiedy użyłem 1. Możesz spróbować 2.


To jest złoto! Dziękuję Ci!
grrigore

3

Aby Twój widok jako match_parent nie był możliwy bezpośrednio, ale możemy to zrobić w trochę inny sposób, ale nie zapomnij użyć atrybutu Left and Right z początkiem i końcem, bo jeśli używasz obsługi RTL, będzie to potrzebne.

    <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

ustaw szerokość lub wysokość (cokolwiek potrzebujesz, aby dopasować rodzica) do 0dp i ustaw marginesy lewego, prawego, górnego, dolnego, aby działały jako dopasowany rodzic


1

w dokumencie biurowym: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

Gdy wymiar jest ustawiony na MATCH_CONSTRAINT, domyślnym zachowaniem jest to, że wynikowy rozmiar zajmuje całą dostępną przestrzeń.

Używając 0dp, co jest odpowiednikiem „MATCH_CONSTRAINT”

Ważne: MATCH_PARENT nie jest zalecany w przypadku widżetów zawartych w ConstraintLayout. Podobne zachowanie można zdefiniować za pomocą MATCH_CONSTRAINT z odpowiednimi ograniczeniami lewy / prawy lub górny / dolny ustawionym na „nadrzędny”


0

Jeśli chcesz, aby TextView znajdował się w środku elementu nadrzędnego ..
Twój główny układ to Układ ograniczeń

<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

Znalazłem jeszcze jedną odpowiedź, gdy w widoku przewijania znajduje się układ ograniczeń, które musimy umieścić

android:fillViewport="true"

do widoku przewijania

i

android:layout_height="0dp"

w układzie ograniczeń

Przykład:

<?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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.