RelativeLayout verwendet den Vollbildmodus für wrap_content

126

Warum wird FOOBARZ ganz unten angeordnet, wenn keine Elemente vorhanden sind layout_height="fill_parent", dh alle Elemente sind wrap_content für die Höhe? Geben Sie hier die Bildbeschreibung ein

<?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>
Hunterp
quelle
1
Verwenden Sie hierarchyvieweroder die Perspektive der Hierarchieansicht in Eclipse, um festzustellen, wo etwas schief geht: developer.android.com/guide/developing/debugging/…
CommonsWare
Wo befindet sich die Perspektive der Hierarchieansicht innerhalb von Eclipse? Welcher Bildschirm?
Hunterp
1
Fenster> Perspektive öffnen> Andere ... - obwohl ich denke, dass Sie Ihre Antwort bereits haben, mit freundlicher Genehmigung von @alextc.
CommonsWare
@ CommonsWare Ich habe es gefunden, aber es ist leer. Wie kann ich tatsächlich ein Layout darin laden?
Hunterp

Antworten:

266

Aus dem RelativeLayoutDokument:

Klassenübersicht

Ein Layout, in dem die Positionen der Kinder in Bezug zueinander oder zum Elternteil beschrieben werden können.

Beachten Sie, dass Sie keine zirkuläre Abhängigkeit zwischen der Größe des RelativeLayout und der Position seiner untergeordneten Elemente haben können. Beispielsweise können Sie kein RelativeLayout haben, dessen Höhe auf WRAP_CONTENT und ein untergeordnetes Element auf ALIGN_PARENT_BOTTOM festgelegt ist

Klassendokumentation

Welches ist genau Ihr Fall. RelativeLayout kann das nicht.

Gemeinschaft
quelle
3
Also habe ich das align_parentBottom entfernt und das Layout ist jetzt nur noch 1/10 des Bildschirms, wie es sein sollte. Wie kann ich FOOBARZ am unteren Rand platzieren?
Hunterp
2
Wenn ich nur einen kurzen Blick darauf werfen würde, würde ich sagen: Nehmen Sie die FOOBARZ-Textansicht, verschieben Sie sie in das äußere RelativeLayout und setzen Sie android: layout_below = "@ id / feed_u". Ich bin mir nicht ganz sicher, ob du das willst.
Haben Sie versucht, dem relativen Layout eine feste Höhe android:layout_height="200dp"android:layout_alignParentBottom="true"
zuzuweisen
1
Beachten Sie, dass dies auch passieren kann, wenn Sie eine große Zeichenfläche als Hintergrund verwenden. Um dies zu umgehen, ziehen Sie den Hauptinhalt in ein untergeordnetes Layout und machen Sie den Hintergrund zu einem Geschwister <ImageView>, das dahinter steht.
Ben Leggiero
1
Mir ist aufgefallen, dass die Kinder auch keinen layout_heightvonmatch_parent
Daniel F
52

Für diejenigen, die nach einer Lösung suchen, wie ich es getan habe, können Sie FrameLayoutstattdessen verwenden RelativeLayout.

Dann können Sie die Schwerkraft des beabsichtigten Objekts wie unten rechts unten einstellen

<TextView
    android:layout_gravity="bottom|right"
    android:text="FOOBARZ"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
</TextView>
Muz
quelle
Die Verwendung des FrameLayout ist eine großartige Lösung. Wenn Sie mehr Komponenten in diesem Layout haben, müssen Sie den Rand festlegen, um Überlappungen zu vermeiden.
Veronnie
23

Sie haben das RelativeLayout auf "wrap_content" und die Textansicht auf festgelegt android:layout_alignParentBottom="true", sodass automatisch versucht wird, das RelativeLayout nach unten zu strecken. Verwenden Sie solche Abhängigkeiten nicht mit dem relativen Layout, da dies als "zirkuläre Abhängigkeiten" gelten kann.

Aus den Dokumenten für RelativeLayout :

Beachten Sie, dass Sie keine zirkuläre Abhängigkeit zwischen der Größe des RelativeLayout und der Position seiner untergeordneten Elemente haben können. Beispielsweise können Sie kein RelativeLayout haben, dessen Höhe auf WRAP_CONTENTund ein untergeordnetes auf festgelegt ist ALIGN_PARENT_BOTTOM.

Versuchen Sie, Ihre Textansicht an etwas anderem als dem übergeordneten RelativeLayout auszurichten, aber achten Sie auch auf dieses Problem:
Zirkuläre Abhängigkeiten benötigen Hilfe beim genauen Code

Versuchen Sie alternativ, komplexere innere Layouts hinzuzufügen.

Dirol
quelle
2
Übrigens denke ich zur Laufzeit - Ihr Code würde angezeigt, wie Sie möchten, auch mit "android: layout_alignParentBottom =" true "". Es scheint, dass Android diesen Fall zur Laufzeit zusätzlich analysiert und korrekt anzeigt. Sie sollten versuchen, Ihre App auszuführen.
Dirol
0

Gute Antworten. Wenn Sie layout_alignParentBottom="true"dieses Problem noch nicht haben und immer noch haben, android:background="@drawable/bkgnd"achten Sie darauf, wo bkgnd ein großes Problem ist.

Kellogs
quelle
0

Ich bin mir nicht sicher, warum der saubere und offensichtliche Weg, dies zu erreichen, noch nicht veröffentlicht wurde. Diese performante Lösung funktioniert für jede Ansicht MyView mit einer bekannten Höhe.

Wickeln Sie Ihre RelativeLayoutmit Höhe wrap_contentin ein 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>

Beachten Sie nur, dass sich die Ansicht am unteren Rand des FrameLayout über Ihrem RelativeLayoutInhalt befindet. Sie müssen daher am unteren Rand des Layouts einen Abstand hinzufügen, um es aufzunehmen. Wenn Sie möchten, dass diese Ansicht eine variable Höhe hat, können Sie entweder FrameLayout in Unterklassen unterteilen, um den Code basierend auf der gemessenen Ansichtshöhe aufzufüllen, oder das FrameLayout einfach in vertikales LinearLayout ändern, wenn Sie sich keine Gedanken über die Leistung machen, dh es handelt sich nicht um eine Listenansicht Artikel, oder die Ansichten sind relativ leicht.

Johnny C.
quelle
0

Verwenden Sie keine Eigenschaften des Typs alight_Parent für die untergeordneten Ansichten

Sie können das Rahmenlayout anstelle von RelativeLayout mit der jeweiligen Schwerkraft verwenden

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