56 votes

Android RelativeLayout ci-dessous 2 vues

J'ai un RelativeLayout comme ça :

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/single_row"
    android:padding="12dip">

    <ImageView
        android:id="@+id/page_image"
        android:layout_marginRight="6dip"
        android:layout_width="66dip"
        android:layout_height="66dip"
        android:layout_alignParentLeft="true"
        android:src="@drawable/no_photo" />
    <TextView
        android:id="@+id/page_name"
        style="@style/pulse_content"
        android:layout_alignTop="@id/page_image"
        android:layout_toRightOf="@id/page_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/page_desc"
        android:layout_below="@id/page_name"
        style="@style/pulse_content"
        android:layout_alignLeft="@id/page_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Principal Consultant" />
    <Button
        android:id="@+id/follow_button"
        android:layout_below="@id/author_image"
        android:layout_marginTop="15dip"
        android:layout_alignParentBottom="true"
        android:text="Follow"
        style="@style/follow_button" />
</RelativeLayout>

Le problème auquel je suis confronté est que je veux que les follow_button pour être en dessous des deux page_desc ainsi que le page_image . Parfois, le page_desc Le contenu aura une hauteur supérieure à la taille de l'image, parfois non. Le problème est que si je règle le paramètre follow_button sous l'image ou la description, l'autre sera coupée. Existe-t-il un moyen efficace de s'assurer que l'image ou la description ne sont pas coupées ? page_desc sont toujours visibles et au-dessus du bouton ?

0 votes

Vous pourriez essayer de placer votre page_desc et votre page_image dans un LinearLayout et le follow_button en dessous du LinearLayout ?

0 votes

J'espérais éviter cela car cela crée des objets supplémentaires (et donc de la mémoire), mais je suppose que s'il n'y a pas d'autre option, je devrai le faire.

0 votes

Vous pourriez imposer aux deux vues de texte d'avoir une certaine hauteur, mais j'utiliserais la réponse de @Sephy. Si cela fait partie d'un ListView quelconque, il devrait être réutilisé sur votre appel getView() dans votre adaptateur.

49voto

Zsombor Erdődy-Nagy Points 8376

Voilà :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@drawable/single_row"
    android:padding="12dip">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/page_image"
            android:layout_marginRight="6dip"
            android:layout_width="66dip"
            android:layout_height="66dip"
            android:layout_alignParentLeft="true"
            android:src="@drawable/no_photo" />
        <TextView
            android:id="@+id/page_name"
            style="@style/pulse_content"
            android:layout_alignTop="@id/page_image"
            android:layout_toRightOf="@id/page_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/page_desc"
            android:layout_below="@id/page_name"
            style="@style/pulse_content"
            android:layout_alignLeft="@id/page_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Principal Consultant" />
    </RelativeLayout>

    <Button
        android:id="@+id/follow_button"
        android:layout_marginTop="15dip"
        android:text="Follow"
        style="@style/follow_button" />
</LinearLayout>

11 votes

? ?? Le but de l'utilisation de RelativeLayout est d'ÉVITER d'avoir à imbriquer des LinearLayouts. :(

4 votes

Je ne vois pas comment résoudre ce cas avec un seul RelativeLayout. Vous ne pouvez pas définir un élément pour être en dessous de 2 autres éléments. Postez une autre réponse si vous pouvez résoudre ce problème sans imbriquer les ViewGroups. De plus, où est-il dit que le but du RelativeLayout est d'éviter l'imbrication ? Il peut être utilisé pour cela dans de nombreuses situations, c'est vrai, mais il y a des exceptions.

1 votes

J'espérais une solution plus élégante, mais il semble que vous ayez tout à fait raison.

8voto

Fuzzical Logic Points 5135

La réponse à cette question nécessite très peu de changements. La plupart des éléments de votre mise en page sont corrects, mais il y a une option qui perturbe tout. L'option AlignParentXXXX a souvent une " fausse " priorité sur les options LayoutXXXX. Ainsi, en définissant votre bouton sur AlignParentBottom, vous indiquez au RelativeLayout que la taille du bouton n'est pas calculée dans la taille du layout parent.

Vous pouvez résoudre ce problème en supprimant simplement AlignParent="true" de votre bouton. Le code résultat est ci-dessous et testé. Cette solution reste conforme à vos souhaits, je crois.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/single_row"
    android:padding="12dip">

    <ImageView
        android:id="@+id/page_image"
        android:layout_marginRight="6dip"
        android:layout_width="66dip"
        android:layout_height="66dip"
        android:layout_alignParentLeft="true"
        android:src="@drawable/no_photo" />
    <TextView
        android:id="@+id/page_name"
        style="@style/pulse_content"
        android:layout_alignTop="@id/page_image"
        android:layout_toRightOf="@id/page_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/page_desc"
        android:layout_below="@id/page_name"
        style="@style/pulse_content"
        android:layout_alignLeft="@id/page_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Principal Consultant" />
    <Button
        android:id="@+id/follow_button"
        android:layout_below="@id/author_image"
        android:layout_marginTop="15dip"
        android:text="Follow"
        style="@style/follow_button" />
</RelativeLayout>

J'ai rencontré de nombreux problèmes similaires avec AlignParent lorsque WrapContent était sur le Parent. Le positionnement en haut et en bas crée un comportement indésirable si l'on n'y est pas préparé. En général, je trouve qu'il est préférable de n'utiliser que l'un ou l'autre (si c'est le cas) et d'aligner le reste au-dessus ou en dessous.

0 votes

Désolé les gars, je voulais offrir la prime sur une question différente. mes excuses pour la confusion.

3voto

HandlerExploit Points 3881

Comme tout est interdépendant dans le RelativeLayout, l'ordre dans lequel vous le placez n'a pas d'importance, mais il en a si vous essayez d'accéder à une vue avant sa création. Par exemple, l'utilisation de l'attribut Android:layout_below n'est pas exactement ce que vous vouliez pour le bouton. Si vous définissez les autres vues dans l'attribut Android:layout_above du bouton, les vues se trouveront toujours au-dessus de celui-ci.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/single_row"
    android:padding="12dip">

    <Button
        android:id="@+id/follow_button"
        android:layout_marginTop="15dip"
        android:layout_alignParentBottom="true"
        android:text="Follow"
        style="@style/follow_button" />
    <ImageView
        android:id="@+id/page_image"
        android:layout_above="@id/follow_button"
        android:layout_marginRight="6dip"
        android:layout_width="66dip"
        android:layout_height="66dip"
        android:layout_alignParentLeft="true"
        android:src="@drawable/no_photo" />
    <TextView
        android:id="@+id/page_name"
        android:layout_above="@id/follow_button"
        style="@style/pulse_content"
        android:layout_alignTop="@id/page_image"
        android:layout_toRightOf="@id/page_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/page_desc"
        android:layout_above="@id/follow_button"
        android:layout_below="@id/page_name"
        style="@style/pulse_content"
        android:layout_alignLeft="@id/page_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Principal Consultant" />
</RelativeLayout>

0 votes

L'alignement sur le bas du parent n'est pas une solution générale, mais je préfère cette solution à l'ajout de mises en page imbriquées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X