RelativeLayout использует полноэкранный режим для wrap_content - PullRequest
119 голосов
/ 26 июня 2011

Почему 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>

Ответы [ 6 ]

251 голосов
/ 27 июня 2011

Из RelativeLayout документа:

Обзор класса

Схема, в которой позиции детей могут быть описаны по отношению друг к другу или к родителю.

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

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

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

50 голосов
/ 18 октября 2015

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

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

<TextView
    android:layout_gravity="bottom|right"
    android:text="FOOBARZ"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
</TextView>
21 голосов
/ 27 июня 2011

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

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

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

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

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

0 голосов
/ 11 апреля 2017

Не использовать свойства типа 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>
0 голосов
/ 15 марта 2017

Я не уверен, почему чистый и очевидный способ сделать это еще не был опубликован.Это эффективное решение работает для любого 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 контента, поэтому вам нужно будет добавить отступ в нижней части этого макета, чтобы разместить его.Если вы хотите, чтобы это представление было переменной высоты, вы можете либо добавить подкласс FrameLayout, чтобы добавить заполнение в код, основанный на измеренной высоте представления, либо просто изменить FrameLayout на вертикальное LinearLayout, если вы не беспокоитесь о производительности, то есть это не просмотр списка.пункт, или виды относительно легки.

0 голосов
/ 11 января 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...