Establecer el ancho para que coincida con las restricciones en ConstraintLayout

97

Me gustaría restringir los lados izquierdo y derecho de una vista a los márgenes de la vista principal y hacer que llene el espacio asignado. Sin embargo, establecer el ancho en match_parento wrap_contentparece producir el mismo resultado.

¿Hay algo equivalente a match_constraints (a diferencia de match_parent y wrap_content)? ¿ Afectan match_parenty wrap_contentafectan al diseño o se ignoran en el nuevo diseño de restricción?

¡Me encanta este nuevo sistema de diseño para mi plataforma favorita!

KG6ZVP
fuente
1
¿ match_parentPor qué no funciona para ti?
Eugen Martynov

Respuestas:

120

match_parentno es apoyado. Con 0dp, puede pensar en sus limitaciones como 'escalables' en lugar de 'llenar lo que queda'.

Además, 0dpse puede definir por una posición, donde match_parentdepende de su padre para su posición (x, y y ancho, alto)

brob
fuente
31
¿¡¿Por qué esta respuesta aceptada?!? match_parent no es compatible con el diseño de restricción. Y esta respuesta no da forma de implementarlo.
Daniele Segato
3
match_parent no es compatible.
Nicolas Roard
7
Esta respuesta es correcta. Indica claramente que match_parent no es compatible. Además, para realizar una alternativa razonable a la configuración 'match_parent', 0dp con restricciones establecidas en parent a la izquierda y a la derecha (margen 0 o elegir a medida) dará el mismo resultado. Lo único que realmente se dejó fuera en esta respuesta, que está en la respuesta de Arieck, es la necesidad de establecer restricciones en ambos lados (o arriba y abajo para la vertical). Así es como lo hago y no he tenido ningún problema. Además, funciona como ajuste de peso cuando se usa con otros componentes.
Tequilaman
Si alguien viene aquí buscando la respuesta, no funciona. Parece que se rompió en beta. Parece funcionar en 1.0.2. Lección aprendida: congele las bibliotecas, no use actualizaciones oportunistas.
inteist
1
El comentario de @Tequilaman puede ser la respuesta. Ha señalado correctamente la forma de implementarlo. Cree una restricción en ambos lados con un margen de 0dp, funciona.
Utkarsh Mankad
168

match_parentNo se permite. Pero en realidad puede establecer el ancho y el alto en 0dp y establecer las restricciones superior e inferior o izquierda y derecha en "padre".

Entonces, por ejemplo, si desea tener la match_parentrestricción en el ancho del elemento, puede hacerlo así:

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>
Arieck
fuente
4
El equipo de Android debería hacer que "match_parent" funcione. Sería extremadamente fácil. Simplemente haga que match_parent proporcione la misma funcionalidad que si la aplicación estuviera restringida al inicio y al final del padre. Sería fácil de detectar vertical u horizontalmente.
bharv14
Pero, ¿no resulta 0dp en una doble medida?
Pramod Garg
25

Aparentemente match_parentes:

  • NO está bien para vistas directamente debajoConstraintLayout
  • Aceptar para vistas anidadas dentro de vistas que están directamente debajoConstraintLayout

Entonces, si necesita que sus vistas funcionen como match_parent, entonces:

  1. Los hijos directos de ConstraintLayoutdeben usar0dp
  2. Los elementos anidados (por ejemplo, nieto de ConstraintLayout) pueden usarmatch_parent

Ejemplo:

<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>
Gene Bo
fuente
¿Qué pasa con un ConstraintLayout anidado en un ConstraintLayout, en su ejemplo, cambie TextInputLayout a un ConstraintLayout?
superusuario
16

match_parentno es compatible con ConstraintLayout. Establezca el ancho en 0dppara que coincida con las restricciones.

Marcin Koziński
fuente
y wrap_content es compatible?
KG6ZVP
Sí, por lo que puedo decir.
Marcin Koziński
6
wrap_content es compatible
Romain Guy
13

Del documento oficial :

Importante: MATCH_PARENT no se recomienda para widgets contenidos en un ConstraintLayout. Se puede definir un comportamiento similar utilizando MATCH_CONSTRAINT con las correspondientes restricciones izquierda / derecha o superior / inferior definidas como "padre".

Entonces, si quieres lograr un MATCH_PARENTefecto, puedes hacer esto:

<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" />
xymelon
fuente
4

Puede comprobar su adaptador.

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

Tuve el mismo problema que tú cuando usé 1. Puedes probar 2.

Kim jeong woo
fuente
¡Esto es oro! ¡Gracias!
Grrigore
3

Hacer su vista como match_parent no es posible directamente, pero podemos hacerlo de una manera un poco diferente, pero no olvide usar el atributo Izquierda y Derecha con Inicio y Fin, porque si usa soporte RTL, será necesario.

    <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"/>
Shubham Santuwala
fuente
2

establezca el ancho o la altura (lo que necesite para que coincida con el padre) en 0dp y establezca los márgenes de izquierda, derecha, arriba, abajo para que actúe como padre coincidente

santhosh
fuente
1

en el documento de la oficina: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

Cuando una dimensión se establece en MATCH_CONSTRAINT, el comportamiento predeterminado es que el tamaño resultante ocupe todo el espacio disponible.

Usando 0dp, que es el equivalente a "MATCH_CONSTRAINT"

Importante: MATCH_PARENT no se recomienda para widgets contenidos en un ConstraintLayout. Se puede definir un comportamiento similar usando MATCH_CONSTRAINT con las correspondientes restricciones izquierda / derecha o superior / inferior configuradas como "principal".

Chuanxing Zhao
fuente
0

Si desea TextView en el centro del padre ...
Su diseño principal es Diseño de restricción

<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>
khyati naik
fuente
0

Encontré una respuesta más cuando hay un diseño de restricción dentro de la vista de desplazamiento, entonces tenemos que poner

android:fillViewport="true"

a la vista de desplazamiento

y

android:layout_height="0dp"

en el diseño de restricción

Ejemplo:

<?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>
Sneha Mudhigonda
fuente