131 votes

RelativeLayout prend le plein écran pour wrap_content

Pourquoi FOOBARZ se retrouve-t-il 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 ? enter image description here

<?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>

1 votes

Utilisez hierarchyviewer ou la perspective de la vue hiérarchique dans Eclipse pour déterminer où les choses ne vont pas : developer.Android.com/guide/developing/debugging/

0 votes

Où se trouve la perspective de la vue hiérarchique à l'intérieur d'eclipse ? Quel écran ?

1 votes

Fenêtre > Ouvrir la perspective > Autre... -- ... mais je pense que vous avez déjà votre réponse, grâce à @alextc.

271voto

De la RelativeLayout doc :

Aperçu de la classe

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

Notez que vous ne pouvez pas avoir une dépendance circulaire entre la taille du 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 des classes

Ce qui est exactement votre cas. RelativeLayout ne peut pas faire cela.

57voto

Muz Points 1116

Pour ceux qui cherchent une solution à ce problème, comme je l'ai fait, vous pouvez utiliser FrameLayout au lieu de RelativeLayout .

Ensuite, vous pouvez définir la gravité de l'objet visé 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>

23voto

Dirol Points 103

Vous avez réglé le RelativeLayout sur "wrap_content" et le TextView à 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".

De les documents relatifs à RelativeLayout :

Notez que vous ne pouvez pas avoir une dépendance circulaire entre la taille du 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 réglé sur ALIGN_PARENT_BOTTOM .

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

Vous pouvez aussi essayer d'ajouter des mises en page intérieures plus sophistiquées.

3 votes

Au fait, je pense qu'au moment de l'exécution, votre code sera affiché comme vous le souhaitez, même avec l'option "Android:layout_alignParentBottom="true"". Il semble qu'Android effectue une analyse supplémentaire de ce cas au moment de l'exécution et l'affiche correctement. Vous devriez essayer d'exécuter votre application.

1voto

amit Points 1

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

Vous pouvez utiliser la mise en page du cadre au lieu de RelativeLayout avec une 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>

1voto

Amir Golan Points 51

FrameLayout permet généralement de placer différentes vues les unes au-dessus des autres (où l'enfant le plus récent se trouve au-dessus de l'enfant précédent). Dans votre cas, vous souhaitez placer les vues les unes à côté des autres (au-dessus, au-dessous, au début, à la fin). ConstrainLayout s'adapte mieux parce que c'est exactement ce qu'il fait.

Contrairement à RelativeLayout vous serez en mesure de définir le ConstrainLayout largeur à wrap_content tout en disposant ses vues enfants comme vous le souhaitez, par exemple au lieu de

android:layout_alignParentTop="true"

vous pouvez utiliser

grid:layout_constraintTop_toTopOf="parent" 

et au lieu de

android:layout_alignParentBottom="true"

vous pouvez utiliser

grid:layout_constraintBottom_toBottomOf="parent"

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