RelativeLayout принимает полноэкранный режим для wrap_content

Почему FOOBARZ укладывается полностью вниз, когда нет элементов layout_height="fill_parent", другими словами, все элементы являются wrap_content для высоты? 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

Из RelativeLayout doc:

Обзор класса

Макет, где позиции детей могут быть описаны относительно друг друга или родителя.

Обратите внимание, что вы не можете иметь круговую зависимость между размером RelativeLayout и положением своих детей. Например, у вас не может быть RelativeLayout, высота которого установлена ​​на WRAP_CONTENT, а дочерний элемент установлен на ALIGN_PARENT_BOTTOM

Документация по классу

Это именно ваш случай. RelativeLayout не может этого сделать.

Ответ 2

Для тех, кто ищет решение для этого, как и я, вы можете использовать FrameLayout вместо RelativeLayout.

Затем вы можете установить гравитацию для объекта, находящегося внизу справа, как показано ниже

<TextView
    android:layout_gravity="bottom|right"
    android:text="FOOBARZ"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
</TextView>

Ответ 3

Вы установили RelativeLayout в "wrap_content" и TextView до android:layout_alignParentBottom="true", поэтому он автоматически пытается растянуть RelativeLayout до нижней. Не используйте такие зависимости с Relative Layout, поскольку они могут считаться "круговыми зависимостями".

От документы для RelativeLayout:

Обратите внимание, что вы не можете иметь круговую зависимость между размером RelativeLayout и положением своих детей. Например, у вас не может быть RelativeLayout, высота которого установлена ​​на WRAP_CONTENT, а дочерний набор - ALIGN_PARENT_BOTTOM.

Попытайтесь выровнять свой TextView с чем-то другим, кроме родительского RelativeLayout, но также следите за этой проблемой:
Круговые зависимости, нужна помощь с точным кодом

В качестве альтернативы попробуйте добавить более сложные внутренние макеты.

Ответ 4

Хорошие ответы. Теперь, если у вас нет layout_alignParentBottom="true", и вы все равно получите эту проблему, обратите внимание на android:background="@drawable/bkgnd", где bkgnd является biggie.

Ответ 5

Я не уверен, почему чистый и очевидный способ сделать это еще не опубликован. Это решение для исполнителей работает для любого View MyView с известной высотой.

Оберните RelativeLayout высотой wrap_content в 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>

Просто обратите внимание, что представление в нижней части FrameLayout будет поверх вашего контента RelativeLayout, поэтому вам нужно будет добавить дополнение к нижней части этого макета для его размещения. Если вы хотите, чтобы это представление было переменной высотой, вы можете использовать Subclass FrameLayout для добавления дополнения в код на основе измеренной высоты просмотра или просто изменить FrameLayout на вертикальный LinearLayout, если вас не беспокоит производительность, то есть это не список или взгляды относительно легкие.

Ответ 6

Не используйте свойства типа alight_Parent с дочерними представлениями

Вы можете использовать рамочную компоновку вместо RelativeLayout с соответствующей гравитацией

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