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:
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 LinearLayout
s 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.
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
.
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.
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.
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>
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);
}
});