Defina a largura para corresponder às restrições em ConstraintLayout


97

Eu gostaria de restringir os lados esquerdo e direito de uma visualização às margens da visualização pai e fazê-la preencher o espaço alocado. No entanto, definir a largura como match_parentou wrap_contentparece produzir o mesmo resultado.

Existe algo equivalente a match_constraints (em oposição a match_parent e wrap_content)? Fazer match_parente wrap_contentafetam o layout ou eles são ignorados no novo layout restrição?

Amando este novo sistema de layout para a minha plataforma favorita!


1
Por match_parentque não funciona para você?
Eugen Martynov

Respostas:


120

match_parentnão é suportado. Com 0dp, você pode pensar em suas restrições como 'escaláveis' em vez de 'preencher o que resta'.

Além disso, 0dppode ser definido por uma posição, onde match_parentdepende de seu pai para sua posição (x, y e largura, altura)


31
por que essa resposta é aceita?!? match_parent não é compatível com o layout de restrição. E essa resposta não dá como implementá-lo.
Daniele Segato

3
match_parent não é compatível.
Nicolas Roard

7
Esta resposta está correta. Ele afirma claramente que match_parent não é compatível. Além disso, para executar uma alternativa razoável para uma configuração 'match_parent', 0dp com restrições definidas para pai à esquerda e à direita (margem 0 ou escolha adequada) dará o mesmo resultado. A única coisa que realmente foi omitida nesta resposta, que está na resposta de Arieck, é a necessidade de definir restrições em ambos os lados (ou superior e inferior para vertical). É assim que eu faço e não tive problemas. Além disso, ele funciona como um ajuste de peso quando usado com outros componentes.
Tequilaman

Se alguém chega aqui buscando a resposta não está funcionando. Parece que quebrou na versão beta. Parece funcionar em 1.0.2. Lição aprendida - congele as bibliotecas, não use atualizações oportunistas.
inteist

1
O comentário de @Tequilaman pode ser a resposta. Ele apontou acertadamente a maneira de implementá-lo. Crie uma restrição em ambos os lados com margem de 0 dp, isso resolve o problema.
Utkarsh Mankad

168

match_parentnão é permitido. Mas você pode definir a largura e a altura como 0 dp e definir as restrições superior e inferior ou esquerda e direita como "pai".

Então, por exemplo, se você quiser ter a match_parentrestrição na largura do elemento, você pode fazer assim:

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

4
A equipe Android deve fazer o "match_parent" funcionar. Seria extremamente fácil. Basta fazer com que match_parent forneça a mesma funcionalidade como se o aplicativo fosse restrito ao início e ao final do pai. Seria fácil detectar verticalmente ou horizontalmente.
bharv14,

Mas 0dp não resulta em medição dupla?
Pramod Garg

25

Aparentemente match_parenté:

  • NÃO OK para visualizações diretamente abaixoConstraintLayout
  • OK para visualizações aninhadas dentro de visualizações que estão diretamente sobConstraintLayout

Portanto, se você precisa que suas visualizações funcionem como match_parent, então:

  1. Filhos diretos de ConstraintLayoutdevem usar0dp
  2. Elementos aninhados (por exemplo, neto de ConstraintLayout) podem usarmatch_parent

Exemplo:

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

que tal um ConstraintLayout aninhado em um ConstraintLayout, no seu exemplo, altere TextInputLayout para um ConstraintLayout?
superusuário de


13

Do documento oficial :

Importante: MATCH_PARENT não é recomendado para widgets contidos em um ConstraintLayout. Comportamento semelhante pode ser definido usando MATCH_CONSTRAINT com as restrições esquerda / direita ou superior / inferior correspondentes sendo definidas como "pai".

Portanto, se você deseja obter MATCH_PARENTefeito, pode fazer o seguinte:

<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

Você pode verificar o seu adaptador.

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

Tive o mesmo problema que você quando usei 1. Você pode tentar 2.


Isso é ouro! Obrigado!
grrigore

3

Para fazer sua view como match_parent não é possível diretamente, mas podemos fazer isso de uma maneira um pouco diferente, mas não se esqueça de usar os atributos Left e Right com Start e End, porque se você usar suporte RTL, será necessário.

    <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

defina a largura ou altura (o que quer que você precise para corresponder ao pai) para 0dp e defina as margens esquerda, direita, superior e inferior para atuar como pai correspondente


1

no documento do escritório: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

Quando uma dimensão é definida como MATCH_CONSTRAINT, o comportamento padrão é fazer com que o tamanho resultante ocupe todo o espaço disponível.

Usando 0dp, que é equivalente a "MATCH_CONSTRAINT"

Importante: MATCH_PARENT não é recomendado para widgets contidos em um ConstraintLayout. Comportamento semelhante pode ser definido usando MATCH_CONSTRAINT com as restrições esquerda / direita ou superior / inferior correspondentes sendo definidas como "pai"


0

Se você quiser TextView no centro do pai ...
Seu layout principal é o Layout de restrição

<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

Eu encontrei mais uma resposta quando há um layout de restrição dentro da visualização de rolagem, então precisamos colocar

android:fillViewport="true"

para a visualização de rolagem

e

android:layout_height="0dp"

no layout de restrição

Exemplo:

<?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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.