Imposta la larghezza in modo che corrisponda ai vincoli in ConstraintLayout


97

Vorrei vincolare i lati sinistro e destro di una vista ai margini della vista genitore e far sì che riempia lo spazio assegnato. Tuttavia, l'impostazione della larghezza su match_parento wrap_contentsembra produrre lo stesso risultato.

C'è qualcosa di equivalente a match_constraints (al contrario di match_parent e wrap_content)? Fare match_parente wrap_contentinfluenzano il layout o sono ignorate nel nuovo layout vincolo?

Adoro questo nuovo sistema di layout per la mia piattaforma preferita!


1
Perché match_parentnon funziona per te?
— Eugen Martynov

Risposte:


120

match_parentnon è supportato. Con0dp , puoi pensare ai tuoi vincoli come "scalabili" piuttosto che "riempire ciò che resta".

Inoltre, 0dppuò essere definito da una posizione, dove match_parentsi basa sul genitore per la sua posizione (x, y e larghezza, altezza)


31
perché è questa risposta accettata?!? match_parent non è supportato dal layout dei vincoli. E questa risposta non dà modo di implementarla.
— Daniele Segato

3
match_parent non è supportato.
— Nicolas Roard

7
Questa risposta è corretta. Indica chiaramente che match_parent non è supportato. Inoltre, per eseguire un'alternativa ragionevole a un'impostazione "match_parent", 0dp con vincoli impostati su genitore a sinistra ea destra (margine 0 o scelta adatta) darà lo stesso risultato. L'unica cosa che è stata davvero tralasciata in questa risposta, che è nella risposta di Arieck, è la necessità di impostare vincoli su entrambi i lati (o superiore e inferiore per verticale). Questo è come lo faccio e non ho avuto problemi. Inoltre funziona come impostazione del peso se utilizzato con altri componenti.
— Tequilaman

Se qualcuno viene qui cercando la risposta perché non funziona. Sembra che sia stato rotto in beta. Sembra funzionare nella 1.0.2. Lezione appresa: congelare le librerie, non utilizzare aggiornamenti opportunistici.
— inteist

1
Il commento di @Tequilaman può essere la risposta. Ha giustamente indicato il modo per attuarlo. Crea un vincolo su entrambi i lati con un margine di 0dp, fa il trucco.
— Utkarsh Mankad

168

match_parentnon è permesso. Ma puoi effettivamente impostare larghezza e altezza su 0dp e impostare i vincoli superiore e inferiore o sinistro e destro su "genitore".

Quindi, ad esempio, se vuoi avere il match_parentvincolo sulla larghezza dell'elemento, puoi farlo in questo modo:

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

4
Il team Android dovrebbe far funzionare "match_parent". Sarebbe estremamente facile. Basta fare in modo che match_parent fornisca la stessa funzionalità come se l'app fosse vincolata all'inizio e alla fine del genitore. Sarebbe facile da rilevare verticalmente o orizzontalmente.
— bharv14

Ma 0dp non produce una doppia misura?
— Pramod Garg

25

Apparentemente match_parentè:

  • NON OK per le visualizzazioni direttamente sottoConstraintLayout
  • OK per le viste nidificate all'interno delle viste che si trovano direttamente sottoConstraintLayout

Quindi, se hai bisogno che le tue visualizzazioni funzionino come match_parent, allora:

  1. I figli diretti di ConstraintLayoutdovrebbero usare0dp
  2. Gli elementi annidati (ad esempio, nipote di ConstraintLayout) possono utilizzarematch_parent

Esempio:

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

che dire di un ConstraintLayout annidato in un ConstraintLayout, nel tuo esempio cambia TextInputLayout in ConstraintLayout?
— superuser


13

Dal documento ufficiale :

Importante: MATCH_PARENT non è consigliato per i widget contenuti in un ConstraintLayout. Un comportamento simile può essere definito utilizzando MATCH_CONSTRAINT con i corrispondenti vincoli sinistra / destra o alto / basso impostati su "genitore".

Quindi, se vuoi ottenere l' MATCH_PARENTeffetto, puoi farlo:

<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

Puoi controllare il tuo adattatore.

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

Ho avuto lo stesso problema come te quando ho usato 1. Puoi provare 2.


Questo è oro! Grazie!
— grrigore

3

Per rendere la tua visualizzazione come match_parent non è possibile direttamente, ma possiamo farlo in un modo leggermente diverso, ma non dimenticare di usare gli attributi Left e Right con Start e End, perché se usi il supporto RTL, sarà necessario.

    <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

imposta la larghezza o l'altezza (di cosa hai bisogno per abbinare il genitore) a 0dp e imposta i margini sinistro, destro, superiore, inferiore per agire come genitore di corrispondenza


1

nel documento dell'ufficio: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

Quando una dimensione è impostata su MATCH_CONSTRAINT, il comportamento predefinito è che la dimensione risultante occupi tutto lo spazio disponibile.

Utilizzo di 0dp, che è l'equivalente di "MATCH_CONSTRAINT"

Importante: MATCH_PARENT non è consigliato per i widget contenuti in un ConstraintLayout. Un comportamento simile può essere definito utilizzando MATCH_CONSTRAINT con i corrispondenti vincoli sinistra / destra o alto / basso impostati su "genitore"


0

Se vuoi TextView al centro del genitore ..
Il tuo layout principale è 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

Ho trovato un'altra risposta quando c'è un layout di vincoli all'interno della visualizzazione a scorrimento, quindi dobbiamo inserire

android:fillViewport="true"

alla visualizzazione a scorrimento

e

android:layout_height="0dp"

nel layout dei vincoli

Esempio:

<?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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.