Свойство match_parent для детей в RelativeLayout
Короче говоря, можно ли указать ребенку в RelativeLayout
всегда соответствовать высоте этого RelativeLayout
, независимо от того, как ведут себя другие дети в том же RelativeLayout
?. Короче говоря, это. Подробности ниже.
То, что я пытаюсь достичь, - это строка ListView
с по меньшей мере тремя представлениями, и одно из этих представлений будет выглядеть как полоса с правой стороны от записи списка (красный вид ниже). Проблема, с которой я столкнулась, состоит в том, что с левой стороны находится TextView
и зависит от того, сколько текста у меня есть, полоса не заполняет весь макет. Это очень четко объяснено изображениями ниже.
ListView
расположение элементов:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<View
android:id="@+id/bottom_line"
android:layout_width="match_parent"
android:layout_height="5dp"
android:layout_alignParentBottom="true"
android:background="#fc0" />
<!-- Why match_parent does not work in view below? -->
<View
android:id="@+id/stripe"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:minHeight="50dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:background="#f00" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/stripe"
android:text="This is a very long line, meant to completely break the match_parent property of the box at right"
style="?android:textAppearanceLarge"/>
</RelativeLayout>
Результат:
![RelativeLayout with child not filling the whole layout vertically]()
Настройка полосы и высоты корня до match_parent
не имеет значения. Я сделал это.
Повторяя вопрос, я хочу, чтобы красная полоса всегда заполняла родительский элемент вертикально. Вы можете видеть, что полоса не совпадает с вершиной корня.
Примечание: приведенный выше пример является самым простым, самодостаточным примером, о котором я могу думать. Это просто ListActivity
с анонимным ArrayAdapter
, заполненным статическим массивом String
. Соответствующий код в onCreate
составляет не более 8 строк, поэтому не стоит беспокоиться. Это действительно макет. Кроме того, я уже работаю с вложенным LinearLayout
, но, если это возможно, я пытаюсь уменьшить глубину структуры макета. LinearLayout
работает нормально, как и ожидалось.
Ответы
Ответ 1
У меня было такое же требование, и моим решением было выровнять верхнюю часть красной полосы с родительским верхом, а нижнюю часть полосы - в нижней части текстового вида слева. Высота в этом случае становится неактуальной. Вы можете использовать wrap_content
или match_parent
.
Ответ 2
Просто разместите свой основной RelativeLayout
внутри LinearLayout
, тогда расчет высоты просмотров детей будет правильным. У меня была такая же проблема, и это сработало для меня.
Ответ 3
Попробуйте следующее:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<View
android:id="@+id/stripe"
android:layout_width="80dp"
android:layout_height="match_parent"
android:layout_alignBottom="@id/text"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/text"
android:background="#f00"
android:minHeight="50dp"/>
<TextView
android:id="@+id/text"
style="?android:textAppearanceLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/stripe"
android:text="This is a very long line, meant to completely break the match_parent property of the box at right"/>
<View
android:id="@+id/bottom_line"
android:layout_width="match_parent"
android:layout_height="5dp"
android:layout_below="@id/text"
android:background="#fc0"/>
</RelativeLayout>
Выравнивание сверху и снизу красного изображения такое же, как textview.
Ответ 4
Это раздражающая проблема, и вам нужно установить RelativeLayout внутри LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minHeight="40dp"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/deleteItem"
android:layout_width="60dp"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:clickable="true"
android:background="@color/background_grey"
>
<TextView
style="@style/SmallButtonFont"
android:layout_marginRight="12dp"
android:layout_centerInParent="true"
android:text="CLEAR"
android:textColor="@color/globalRedLight" />
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
Ответ 5
Добавить слушателя к держателю элемента списка, чтобы каждый раз, когда владелец изменял высоту, задайте эту высоту для ребенка. i1
находится сверху, а i3
- снизу.
parent.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
child.setTop(i1);
child.setBottom(i3);
}
});