RelativeLayout ведет себя иначе, чем элемент представления списка

Добрый день, дроиды!

Я столкнулся с раздражающей проблемой макета, которой у меня нет объяснения после нескольких часов расследования... :/. Я создал сокращенный тестовый пример, который и представляю здесь.

У меня простой макет элемента списка.

http://www.freeimagehosting.net/4075a.jpg

ссылка на изображение элемента

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativeLayout1"
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"
    android:minHeight="96dp">

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:text="TextView"
    android:id="@+id/textView1" android:textAppearance="?android:attr/textAppearanceMedium"
    android:layout_centerVertical="true" android:layout_centerHorizontal="true" />

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="TextView"
    android:id="@+id/textView2" android:layout_alignParentTop="true" />

<ImageView 
    android:layout_width="10dp" 
    android:layout_height="match_parent"
    android:id="@+id/imageView1" 
    android:src="@drawable/errorindicator"
    android:layout_below="@id/textView2" />

</RelativeLayout>

индикатор ошибки — это красный прямоугольник, который вы видите на изображении слева. xml выглядит так:

    <?xml version="1.0" encoding="utf-8"?>
    <shape shape="rectangle"  xmlns:android="http://schemas.android.com/apk/res/android">
     <solid android:color="@color/ControllingConflictColor" />
     <padding android:left="0dp" android:top="0dp" 
         android:right="0dp" android:bottom="0dp" />
    </shape>

Описанный макет элемента списка работает должным образом.

Теперь я пытаюсь заполнить представление списка элементами списка, как описано выше. Результат выглядит так:

http://www.freeimagehosting.net/4cc4b.jpg

ссылка на изображение в виде списка

Соответствующий xml:

    <?xml version="1.0" encoding="utf-8"?>
    <ListView android:id="@+id/listView1" android:layout_width="fill_parent"
        android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- Preview: listitem=@layout/test -->
    </ListView>

Как вы можете видеть на изображении, красный прямоугольник больше не соответствует своему родительскому элементу по высоте, как это должно быть. Изображения сделаны из дизайнера, но тот же эффект есть и на эмуляторе и на устройстве. . Я разрабатываю для уровня API 8.

** Я был бы рад, если бы кто-нибудь объяснил мне, почему описанный макет не работает должным образом в представлении списка. Почему рисуемая форма ведет себя по-другому? **

Спасибо за ваше время :)

редактировать: у меня проблемы с встраиванием изображения, вместо этого я использовал ссылку, извините;( редактировать: добавлен тег xml-drawable.

edit: Мой пример можно сделать намного проще. Я включил два текстовых представления, потому что они имеют некоторое сходство с моим реальным макетом. Вы можете удалить два текстовых представления из примера, и все еще существует проблема, заключающаяся в том, что фигура, которую можно нарисовать в представлении изображения, не соответствует высоте родителей, как определено, если макет используется в представлении списка.


person Diego Frehner    schedule 18.10.2011    source источник
comment
Каков ваш желаемый дизайн макета?   -  person Venky    schedule 18.10.2011
comment
Вам нужна строка ниже всего текстового просмотра, верно?   -  person Venky    schedule 18.10.2011
comment
Venky, вы можете увидеть желаемый дизайн на первом связанном изображении. Проблема в том, что рисуемая красная форма ведет себя иначе, если я использую описанный относительный макет в представлении списка.   -  person Diego Frehner    schedule 19.10.2011


Ответы (3)


Мне также трудно сделать это с помощью RelativeLayout. Что ж, попробуйте этот макет для строки xml. Он использует LinearLayout.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical">
    <TextView android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="TextView" 
        android:id="@+id/textView2" 
        android:layout_alignParentTop="true" />
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <LinearLayout android:layout_width="10dip" 
            android:layout_height="fill_parent"
            android:background="@drawable/errorindicator"/>       
        <TextView android:layout_width="0dip" 
            android:layout_height="wrap_content" 
            android:text="TextView" android:layout_weight="1.0" 
            android:id="@+id/textView1"
            android:textAppearance="?android:attr/textAppearanceMedium" 
            android:gravity="center"/>
   </LinearLayout>
</LinearLayout>
person blessenm    schedule 18.10.2011
comment
Спасибо за ваш ответ Описание проблемы представляет собой сокращенный пример, показывающий, что рисуемая фигура не соответствует высоте родителей, если я использую описанный относительный макет в представлении списка. Таким образом, поведение одного и того же макета отличается, независимо от того, используется он в представлении списка или нет. Я знаю, что есть разные способы визуально добиться того же эффекта, что и в моем примере, но компоновка гораздо проще и производительнее, чем относительная компоновка. Вопрос в том, почему рисуемая форма ведет себя по-другому. Я предполагаю, что в процессе компоновки представлений списка должно быть что-то другое... - person Diego Frehner; 19.10.2011
comment
Я заметил, что когда размер был указан для формы, которую можно нарисовать, он появился. Может попробовать позже и посмотреть, что не так, так как мне это тоже кажется странным. - person blessenm; 19.10.2011
comment
Большое спасибо! Обратите внимание, что я отредактировал свой вопрос и указал, что текстовые представления не имеют значения. - person Diego Frehner; 19.10.2011
comment
Теперь я узнал, что если относительный макет имеет фиксированный android:layout_height, то представление изображения заполняет высоту родителей. Но в моем случае я бы предпочел иметь фиксированное значение (предпочтительная высота) в качестве minHeight, но строка должна иметь возможность расти больше, чем высота... хммм:/ - person Diego Frehner; 19.10.2011
comment
Я предполагаю, что мое желаемое поведение просто невозможно. В документации RelativeLayout говорится: обратите внимание, что у вас не может быть циклической зависимости между размером RelativeLayout и положением его дочерних элементов. Например, у вас не может быть RelativeLayout, высота которого установлена ​​на WRAP_CONTENT, а дочерний элемент — на ALIGN_PARENT_BOTTOM. Таким образом, мой RelativeLayout с его высотой, установленной для переноса содержимого, и дочерними элементами с его высотой, установленной на match_parent, является такой круговой зависимостью!? Но если RelativeLayout сначала вычислит свою высоту через дочерний элемент с определенной высотой, это может сработать... - person Diego Frehner; 19.10.2011

Поскольку я предполагаю, что желаемое поведение невозможно с помощью менеджера компоновки, я пошел другим путем, который соответствует моей личной ситуации.

Я переопределил метод onDraw RelativeLayout и сам закрасил этот красный прямоугольник (после завершения процесса макета и установки высоты)...

person Diego Frehner    schedule 19.10.2011

Если вы сделали актив в виде png, вы можете затем 9-патчить его и добавить в качестве фона RelativeLayout

person FunkTheMonk    schedule 19.10.2011
comment
Спасибо за это предложение. Я не пробовал это, но я могу представить, что это также сработает как обходной путь (даже без 9-патча и с существующей рисуемой формой). Но это все еще не ответ на мой вопрос ;( - person Diego Frehner; 19.10.2011