Подтвердить что ты не робот

Свойство 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 работает нормально, как и ожидалось.

4b9b3361

Ответ 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);
        }
    });