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>
Errorindicator - это красный прямоугольник, который вы можете видеть на изображении с левой стороны. 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.
Я был бы рад, если бы кто-нибудь объяснил мне, почему описанный макет не работает так, как ожидалось в представлении списка. Почему фигура, которую можно нарисовать, ведет себя по-другому? **Спасибо, что уделили мне время:)
Edit: у меня проблемы с внедрением изображения, я использовал ссылку вместо этого, извините ;( edit: добавлен xml-drawable метка.
Edit: мой пример можно даже сделать намного проще. Я включил два вида текста, потому что он имеет некоторое сходство с моим реальным макетом. Вы можете удалить два вида текста из примера, и все еще существует проблема, что фигура, рисуемая в виде изображения, не соответствует родительской высоте, как определено, если макет используется в виде списка.
3 ответа:
Я также нахожу, что это трудно сделать, используя RelativeLayout. Хорошо попробуйте этот макет для вашего XML строки. Он использует макет.
<?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>
Поскольку я предполагаю, что мое желаемое поведение невозможно с менеджером макета give, я пошел другим путем, который соответствует моей личной ситуации.
Я переопределил метод onDraw в RelativeLayout и сам покрасил этот красный прямоугольник (после того, как процесс компоновки завершен и высоты установлены)...