web-dev-qa-db-fra.com

Les marges de contrainte ne fonctionnent pas

L'utilisation du xml en dessous de marginTop est ignorée si la visibilité de la vue à laquelle je suis contraint a disparu.

Cela se produit avec la dernière version de la librairie de mise en page en ce moment com.Android.support.constraint:constraint-layout:1.0.0-beta4

Exemple:

tvMessage et ivCommentImage sont visible - la marge supérieure de 16dp sur llLeftActions et llRightActions fonctionne bien. Si ivCommentImage est gone la marge est ignorée.

<Android.support.v7.widget.CardView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

<Android.support.constraint.ConstraintLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingBottom="16dp">

<!-- some more views here -->

    <TextView
        Android:id="@+id/tvMessage"
        style="@style/SocialFeed.Description"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:layout_marginEnd="16dp"
        Android:layout_marginLeft="16dp"
        Android:layout_marginRight="16dp"
        Android:layout_marginStart="16dp"
        Android:layout_marginTop="16dp"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ivProfile"
        app:layout_goneMarginTop="0dp"
        tools:text="@string/lorem_ipsum_140chars"/>

    <Android.support.v7.widget.AppCompatImageView
        Android:id="@+id/ivCommentImage"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="16dp"
        Android:adjustViewBounds="true"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvMessage"
        app:layout_goneMarginTop="0dp"
        />

    <Android.support.constraint.Guideline
        Android:id="@+id/gCenter"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:orientation="vertical"
        app:layout_constraintGuide_percent="0.5"/>

    <LinearLayout
        Android:id="@+id/llLeftActions"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="16dp"
        Android:gravity="center_vertical|left"
        Android:orientation="horizontal"
        app:layout_constraintLeft_toLeftOf="@+id/tvMessage"
        app:layout_constraintRight_toLeftOf="@+id/gCenter"
        app:layout_constraintTop_toBottomOf="@+id/ivCommentImage"
        app:layout_goneMarginTop="0dp"
        />

    <LinearLayout
        Android:id="@+id/llRightActions"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="16dp"
        Android:gravity="center_vertical|right"
        Android:orientation="horizontal"
        app:layout_constraintLeft_toLeftOf="@+id/gCenter"
        app:layout_constraintRight_toRightOf="@+id/tvMessage"
        app:layout_constraintTop_toBottomOf="@+id/ivCommentImage"
        app:layout_goneMarginTop="0dp"/>


</Android.support.constraint.ConstraintLayout>

</Android.support.v7.widget.CardView>
11
Ognian Gloushkov

Cela fonctionne complètement comme prévu - notez que vous avez ajouté layout_goneMarginTop="0dp" sur @id/llLeftActions et @id/llRightActions...

Ce qui signifie que lorsque le widget vers lequel ils pointent (@id/ivCommentImage) est marqué comme disparu, la marge qui sera utilisée pour la connexion supérieure sera ... 0dp, et non la marge de 16dp. C'est pour ça que ces attributs sont là! :)

consultez la documentation sur comportement de visibilité et attributs de marge disparus

7
Nicolas Roard
<TextView
    Android:id="@+id/textView"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="Available chats"
    tools:layout_editor_absoluteX="1dp"
    tools:layout_editor_absoluteY="1dp" />

<ListView
    Android:id="@+id/listChats"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@+id/textView"/>

Veuillez noter la dernière ligne, l'ajout de contraintes autour des bords fait fonctionner la contrainte.

Vous pouvez également utiliser la vue de conception dans Studio et faire glisser et déposer les contraintes entre les objets.

1
Mindborg