RelativeLayout prend le plein écran pour wrap_content

126

Pourquoi FOOBARZ est-il disposé tout en bas alors qu'aucun élément n'est layout_height="fill_parent"en d'autres termes, tous les éléments sont wrap_content pour la hauteur? entrez la description de l'image ici

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/feed_u"
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:layout_marginLeft="5dip"
        android:scaleType="centerCrop"
        android:drawableTop="@android:drawable/presence_online"
        android:text="U" />
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/feed_u">
        <ImageView
            android:id="@+id/feed_h"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/btn_minus" />
        <ImageView
            android:id="@+id/feed_ha"
            android:layout_toLeftOf="@id/feed_h"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/btn_plus" />
        <TextView
            android:id="@+id/feed_t"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Title">
        </TextView>
        <TextView
            android:id="@+id/feed_a"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Band"
            android:layout_below="@id/feed_t">
        </TextView>
        <TextView
            android:id="@+id/feed_s"
            android:layout_below="@id/feed_a"
            android:text="S"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </TextView>
        <TextView
            android:id="@+id/feed_tm"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="FOOBARZ"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </TextView>

    </RelativeLayout>
</RelativeLayout>
chasseur
la source
1
Utilisez hierarchyviewerou la perspective Hierarchy View dans Eclipse pour déterminer où les choses vont mal: developer.android.com/guide/developing/debugging/...
CommonsWare
Où est la perspective de la vue hiérarchique à l'intérieur de l'éclipse? quel écran?
hunterp
1
Fenêtre> Ouvrir la perspective> Autre ... - bien que je pense que vous avez déjà votre réponse, gracieuseté de @alextc.
CommonsWare
@CommonsWare Je l'ai trouvé, mais il est vide, comment puis-je y charger une mise en page ??
hunterp

Réponses:

266

Du RelativeLayoutdoc:

Aperçu de la classe

Une mise en page où les positions des enfants peuvent être décrites les uns par rapport aux autres ou au parent.

Notez que vous ne pouvez pas avoir de dépendance circulaire entre la taille de RelativeLayout et la position de ses enfants. Par exemple, vous ne pouvez pas avoir un RelativeLayout dont la hauteur est définie sur WRAP_CONTENT et un enfant défini sur ALIGN_PARENT_BOTTOM

Documentation de classe

C'est exactement votre cas. RelativeLayout ne peut pas faire cela.

Communauté
la source
3
J'ai donc supprimé le align_parentBottom et la mise en page est maintenant seulement 1/10 de l'écran comme il se doit, comment puis-je mettre FOOBARZ en bas?
hunterp
2
Juste en jetant un bref coup d'œil, je dirais: prenez le texte FOOBARZ, déplacez-le vers le RelativeLayout externe et définissez android: layout_below = "@ id / feed_u". Je ne sais pas exactement si c'est ce que vous voulez.
Avez-vous essayé d'attribuer une hauteur fixe à la disposition relative (par exemple android:layout_height="200dp". Cela vous permettrait d'utiliserandroid:layout_alignParentBottom="true"
gfrigon
1
Notez que cela peut également se produire lors de l'utilisation d'un grand dessinable comme arrière-plan. Pour le contourner, extrayez le contenu principal dans une mise en page enfant et faites de l'arrière-plan un frère <ImageView>qui se trouve derrière.
Ben Leggiero
1
J'ai remarqué que les enfants ne sont pas non plus autorisés à utiliser un layout_heightdematch_parent
Daniel F
52

Pour ceux qui recherchent une solution à ce problème, comme je l'ai fait, vous pouvez utiliser à la FrameLayoutplace de RelativeLayout.

Ensuite, vous pouvez définir la gravité de l'objet prévu en bas à droite comme ci-dessous

<TextView
    android:layout_gravity="bottom|right"
    android:text="FOOBARZ"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
</TextView>
Muz
la source
Utiliser le FrameLayout est une excellente solution. Si vous avez plus de composants dans cette mise en page, vous devez définir une marge pour éviter le chevauchement.
Veronnie
23

Vous avez défini le RelativeLayout sur "wrap_content" et le TextView sur android:layout_alignParentBottom="true", il essaie donc automatiquement d'étirer le RelativeLayout vers le bas. N'utilisez pas de telles dépendances avec Relative Layout, car elles peuvent être considérées comme des "dépendances circulaires".

À partir de la documentation pour RelativeLayout :

Notez que vous ne pouvez pas avoir de dépendance circulaire entre la taille de RelativeLayout et la position de ses enfants. Par exemple, vous ne pouvez pas avoir un RelativeLayout dont la hauteur est définie sur WRAP_CONTENTet un enfant défini sur ALIGN_PARENT_BOTTOM.

Essayez d'aligner votre TextView sur autre chose que le RelativeLayout parent, mais faites également attention à ce problème: les
dépendances circulaires, ont besoin d'aide avec le code exact

Vous pouvez également essayer d'ajouter des dispositions internes plus sophistiquées.

Dirol
la source
2
En passant, je pense qu'au moment de l'exécution - votre code serait affiché comme vous le souhaitez, même avec le "android: layout_alignParentBottom =" true "". Il semble qu'Android effectue une analyse supplémentaire sur ce cas au moment de l'exécution et l'affiche correctement. Vous devriez essayer d'exécuter votre application.
Dirol
0

Bonnes réponses. Maintenant, si vous n'avez pas layout_alignParentBottom="true"encore ce problème, android:background="@drawable/bkgnd"faites attention à l' endroit où bkgnd est un gros problème.

kellogs
la source
0

Je ne sais pas pourquoi la manière claire et évidente d'accomplir cela n'a pas encore été publiée. Cette solution performante fonctionne pour n'importe quel View MyView avec une hauteur connue.

Enveloppez votre RelativeLayouthauteur wrap_contentdans un FrameLayout:

<!-- width here should constrain RelativeLayout -->
<FrameLayout 
     android:layout_width="@dimen/my_layout_width"
     android:layout_height="wrap_content">

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

     <MyView
        ...
        android:layout_gravity="bottom" />
</FrameLayout>

Notez simplement que la vue en bas de FrameLayout sera au-dessus de votre RelativeLayoutcontenu, vous devrez donc ajouter un rembourrage au bas de cette mise en page pour l'adapter. Si vous voulez que cette vue soit à hauteur variable, vous pouvez soit Sous-classe FrameLayout pour ajouter un remplissage dans le code en fonction de la hauteur de vue mesurée, soit simplement changer le FrameLayout en LinearLayout vertical si vous n'êtes pas préoccupé par les performances, c'est-à-dire que ce n'est pas une vue de liste. élément, ou les vues sont relativement légères.

Johnny C
la source
0

N'utilisez pas les propriétés de type alight_Parent avec les vues enfants

Vous pouvez utiliser la disposition du cadre au lieu de RelativeLayout avec la gravité respective

    <FrameLayout
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
     <TextView
        android:layout_gravity="bottom|right"
        android:text="Hello "
        android:layout_height="wrap_content"
        android:layout_width="wrap_content">

    </TextView>

</FrameLayout>
Amit Pathak
la source