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>