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!


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)


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

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>

¿Qué pasa con un ConstraintLayout anidado en un ConstraintLayout, en su ejemplo, cambie TextInputLayout a un ConstraintLayout?
superusuario


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

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.


¡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"/>

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


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


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>

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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.