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

126

Почему FOOBARZ выкладывается полностью внизу, когда никаких элементов нет, layout_height="fill_parent"другими словами, все элементы имеют wrap_content для высоты? введите описание изображения здесь

<?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
источник
1
Используйте hierarchyviewerперспективу Hierarchy View в Eclipse, чтобы определить, где что-то идет не так: developer.android.com/guide/developing/debugging/…
CommonsWare
Где перспектива представления иерархии внутри eclipse? какой экран?
hunterp
1
Окно> Открыть перспективу> Другое ... - хотя я думаю, что у вас уже есть ответ, любезно предоставленный @alextc.
CommonsWare
@CommonsWare Я нашел его, но он пуст, как я могу загрузить в него макет ??
hunterp

Ответы:

266

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

Обзор класса

Макет, в котором положения детей могут быть описаны по отношению друг к другу или к родителю.

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

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

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

Сообщество
источник
3
Итак, я удалил align_parentBottom, и теперь макет занимает только 1/10 экрана, как и должно быть. Как я могу разместить FOOBARZ внизу?
hunterp
2
Просто бегло взглянув, я бы сказал: возьмите текстовое представление FOOBARZ, переместите его во внешний RelativeLayout и установите android: layout_below = "@ id / feed_u". Я не совсем уверен, что вы этого хотите.
Вы пытались назначить фиксированную высоту относительной компоновке (например, android:layout_height="200dp"это позволило бы вам использоватьandroid:layout_alignParentBottom="true"
gfrigon
1
Обратите внимание, что это также может произойти при использовании большого объекта для рисования в качестве фона. Чтобы обойти это, вытащите основное содержимое в дочерний макет и сделайте фон второстепенным <ImageView>.
Ben Leggiero
1
Я заметил , что дети также не могут использовать layout_heightизmatch_parent
Daniel F
52

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

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

<TextView
    android:layout_gravity="bottom|right"
    android:text="FOOBARZ"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
</TextView>
зубрила
источник
Использование FrameLayout - отличное решение. Если у вас больше компонентов в этом макете, вы должны установить поля, чтобы избежать перекрытия.
Веронни,
23

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

Из документов для RelativeLayout :

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

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

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

Dirol
источник
2
Кстати, я думаю, во время выполнения - ваш код будет отображаться так, как вы хотите, даже с "android: layout_alignParentBottom =" true "". Похоже, что Android выполняет дополнительный анализ этого случая во время выполнения и отображает его правильно. Вам следует попробовать запустить свое приложение.
Dirol
0

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

Kellogs
источник
0

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

Не используйте свойства типа 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>
Амит Патхак
источник