web-dev-qa-db-fra.com

propriété match_parent pour les enfants dans un RelativeLayout

En résumé, est-il possible de dire à un enfant dans une RelativeLayout de toujours correspondre à la hauteur de celle-ci RelativeLayout, quel que soit le comportement d'autres enfants de cette même RelativeLayout? En bref, c'est tout. Détails ci-dessous.

Ce que j'essaie de réaliser est une rangée ListView avec au moins trois vues, et l'une de ces vues serait une sorte de bande située à droite de l'entrée de la liste (la vue rouge ci-dessous). Le problème que j'ai est qu'il y a une TextView sur le côté gauche, et dépendant de la quantité de texte que j'ai, la bande ne remplira pas toute la mise en page. Ceci est très clairement expliqué par les images ci-dessous.

ListView disposition de l'article:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content">

<View
        Android:id="@+id/bottom_line"
        Android:layout_width="match_parent"
        Android:layout_height="5dp"
        Android:layout_alignParentBottom="true"
        Android:background="#fc0" />

<!-- Why match_parent does not work in view below? -->
<View
        Android:id="@+id/stripe"
        Android:layout_width="80dp"
        Android:layout_height="wrap_content"
        Android:minHeight="50dp"
        Android:layout_alignParentRight="true"
        Android:layout_alignParentTop="true"
        Android:layout_alignParentBottom="true"
        Android:background="#f00" />

<TextView
        Android:id="@+id/text"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:layout_toLeftOf="@id/stripe"
        Android:text="This is a very long line, meant to completely break the match_parent property of the box at right"
        style="?android:textAppearanceLarge"/>

</RelativeLayout>

Résultat:

RelativeLayout with child not filling the whole layout vertically

Le réglage de la hauteur de la bande et de la racine sur match_parent ne fait aucune différence. Je l'ai fait.

En répétant la question, je veux que la bande rouge remplisse toujours le parent verticalement. Vous pouvez voir que la bande n'est pas alignée sur le dessus de la racine.

A note: l'exemple ci-dessus est l'exemple le plus simple et autonome auquel je puisse penser. C'est juste une ListActivity avec une ArrayAdapter anonyme remplie par un tableau statique String. Le code pertinent dans onCreate est au maximum de 8 lignes, alors ne vous inquiétez pas. C'est vraiment la mise en page. De plus, je travaille déjà avec des LinearLayouts imbriquées, mais j'essaie de réduire un peu la profondeur de ma structure de présentation, si possible. LinearLayout fonctionne bien, comme prévu.

24
davidcesarino

J'avais les mêmes exigences et ma solution consistait à aligner le haut de la bande rouge sur le haut du parent et le bas de la bande au bas de la vue de texte à gauche. La hauteur dans ce cas devient sans importance. Vous pouvez utiliser wrap_content ou match_parent.

33
sergej shafarenka

Placez simplement votre RelativeLayout principale dans une LinearLayout, le calcul de la hauteur de vues enfant sera alors correct. J'ai eu le même problème et cela a fonctionné pour moi.

19
Behzad

Essaye ça: 

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content">

    <View
        Android:id="@+id/stripe"
        Android:layout_width="80dp"
        Android:layout_height="match_parent"
        Android:layout_alignBottom="@id/text"
        Android:layout_alignParentRight="true"
        Android:layout_alignTop="@id/text"
        Android:background="#f00"
        Android:minHeight="50dp"/>

    <TextView
        Android:id="@+id/text"
        style="?android:textAppearanceLarge"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:layout_toLeftOf="@id/stripe"
        Android:text="This is a very long line, meant to completely break the match_parent property of the box at right"/>

    <View
        Android:id="@+id/bottom_line"
        Android:layout_width="match_parent"
        Android:layout_height="5dp"
        Android:layout_below="@id/text"
        Android:background="#fc0"/>

</RelativeLayout>

L'alignement en haut et en bas de la vue rouge est identique à textview maintenant.

6
Namenlos

C'est un problème gênant et vous devez placer le RelativeLayout dans un LinearLayout

 <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:minHeight="40dp"
        >
        <RelativeLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent">
            <RelativeLayout
                Android:id="@+id/deleteItem"
                Android:layout_width="60dp"
                Android:layout_height="match_parent"
                Android:layout_alignParentRight="true"
                Android:clickable="true"
                Android:background="@color/background_grey"
                >
                <TextView
                    style="@style/SmallButtonFont"
                    Android:layout_marginRight="12dp"
                    Android:layout_centerInParent="true"
                    Android:text="CLEAR"
                    Android:textColor="@color/globalRedLight" />
            </RelativeLayout>
    </RelativeLayout>
</LinearLayout>
1
Ronny Shibley

Ajoutez un écouteur au détenteur de la liste afin que chaque fois que le détenteur change de hauteur, définissez cette hauteur sur un enfant. i1 est pour le haut, et i3 est pour le bas. 

parent.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
            child.setTop(i1);
            child.setBottom(i3);
        }
    });
0
C. Alen