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>

1
Використовуйте hierarchyviewerабо перспективу перегляду ієрархії у Eclipse, щоб визначити, куди йде щось не так: developer.android.com/guide/developing/debugging/…
CommonsWare

Де є погляд на ієрархію всередині затемнення? який екран?
hunterp

1
Вікно> Відкрита перспектива> Інше ... - хоча я думаю, ви вже маєте свою відповідь, люб’язно надавши @alextc.
CommonsWare

@CommonsWare Я знайшов його, але його порожнім, як я можу фактично завантажити в нього макет ??
hunterp

Відповіді:


266

Від RelativeLayoutдок.

Огляд класу

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

Зауважте, що ви не можете мати кругову залежність між розміром RelativeLayout і положенням його дітей. Наприклад, ви не можете мати відносний макет, висота якого встановлена ​​на WRAP_CONTENT, а дочірнє значення - ALIGN_PARENT_BOTTOM

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

Який саме ваш випадок. Відносна схема не може цього зробити.


3
Тому я видалив align_parentBottom, і макет тепер становить лише 1/10 екрана, як це має бути, як я можу поставити FOOBARZ внизу цього?
hunterp

2
Лише коротко подивившись, я б сказав: Візьміть перегляд тексту FOOBARZ, перемістіть його до зовнішньої RelativeLayout та встановіть android: layout_below = "@ id / feed_u". Я не точно впевнений, якщо це те, що ви хочете важко.

Ви спробували призначити фіксовану висоту відносному android:layout_height="200dp"android:layout_alignParentBottom="true"
макетю

1
Зауважте, що це також може статися при використанні великого малюнка як фонового зображення. Щоб обійти його, витягніть основний вміст у дочірній макет і зробіть фон, <ImageView>який знаходиться за ним.
Бен Леджієро

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 до низу. Не використовуйте такі залежності з відносним макетом, оскільки це можна вважати "круговими залежностями".

З документів для RelativeLayout :

Зауважте, що ви не можете мати кругову залежність між розміром RelativeLayout і положенням його дітей. Наприклад, ви не можете мати RelativeLayout, висота якого встановлена WRAP_CONTENTта дочірня установлена ALIGN_PARENT_BOTTOM.

Спробуйте вирівняти TextView до чогось іншого, ніж батьківський RelativeLayout, але також слідкуйте за цією проблемою:
кругові залежності, потрібна допомога з точним кодом

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


2
До речі, я думаю, що під час виконання - ваш код відображатиметься так, як ви хочете, навіть із "android: layout_alignParentBottom =" true "". Схоже, що Android виконує додатковий аналіз цього випадку під час виконання та відображає його правильно. Спробуйте запустити додаток.
Діроль

0

Гарні відповіді. Тепер, якщо у вас немає layout_alignParentBottom="true"і все ще отримуєте цю проблему, слідкуйте за тим, android:background="@drawable/bkgnd"де bkgnd - це велике.


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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.