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.