Дочерний элемент RelativeLayout не заполняет высоту RelativeLayout

У меня есть ListView, который заполняется RelativeLayouts. Содержание этих RelativeLayouts может изменить и таким образом изменить их высоту соответственно. На каждом RelativeLayout у меня есть небольшая вертикальная полоса в левой части макета, которая соответствует высоте макета.

это похоже на это -> ссылке

хотя по какой-то причине объект представления, который я использую, не расширяется до высоты макета.

что же Я поступаю неправильно?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/post"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/column_post_selector"
android:orientation="horizontal" >

<!-- Status bar (THIS ISN'T FILLING TO PARENTS' HEIGHT) -->
<View
    android:id="@+id/status"
    android:layout_width="3dp"
    android:layout_height="fill_parent"
    android:layout_alignLeft="@id/post"
    android:layout_marginBottom="2dp"
    android:layout_marginTop="2dp"
    android:background="#33B5E5" />

<ImageView
    android:id="@+id/thumbnail"
    android:layout_width="80dip"
    android:layout_height="80dip"
    android:layout_toRightOf="@id/status"
    android:contentDescription="@string/empty"
    android:layout_marginRight="5dp"
    android:scaleType="fitStart" />

<!-- Title -->

<TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@id/post"
    android:layout_toRightOf="@id/thumbnail"
    android:textColor="#ffffff"
    android:textSize="14sp"
    android:typeface="sans" />
<!-- Rightend Duration -->

<TextView
    android:id="@+id/date"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignTop="@id/title"
    android:layout_marginRight="5dip"
    android:gravity="right"
    android:textColor="#10bcc9"
    android:textSize="12sp"
    android:textStyle="bold" />

</RelativeLayout>

7 ответов


вы хотите добавить layout_alignParentTop="true" и layout_alignParentBottom="true" to status - это гарантирует, что вид касается как верхней, так и нижней части post ' s RelativeLayout.


у меня была аналогичная проблема внутри ячеек моего RecyclerView который имел RelativeLayout как корневой элемент.

обходным путем для меня было обертывание дополнительного LinearLayout вокруг корневого элемента RelativeLayout.

Итак, ваша карта выглядит так:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

        <RelativeLayout 
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
            <View
                android:id="@+id/view_with_same_height_as_parent"
                android:layout_width="10dp"
                android:layout_height="fill_parent"
                android:layout_alignParentBottom="true"
                android:layout_alignParentTop="true"/>
...


    </RelativeLayout>
</LinearLayout>

источник: https://stackoverflow.com/a/28799251/3708094


Если ваш RelativeLayout находится внутри ScrollView, то в ScrollView вам нужно добавить параметр fillViewPort и установить его в true

  <ScrollView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:fillViewport="true">

у меня была аналогичная проблема с RelativeLayout внутри ScrollView. согласно документации есть ошибка на RelativeLayout (до версии 17), которые вызывают ошибки в измеренной высоте, если он добавляется внутри контейнера прокрутки (например, ListView).

поэтому для решения проблемы вы должны вычислить высоту программно.

вы можете сделать свой расширенный класс и переопределить onMeasure метод или добавить OnGlobalLayoutListener родитель вид.

Я выбираю второй путь. Вот мое решение:

Example

findViewById(R.id.scroll_view).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        float topElementPosition = findViewById(R.id.top_element).getY();
        float bottomElementPosition = findViewById(R.id.bottom_element).getY();
        int bottomElementHeight = findViewById(R.id.bottom_element).getMeasuredHeight();
        int height = (int)(bottomElementPosition-topElementPosition+bottomElementHeight);
        findViewById(R.id.view).setMinimumHeight(height);
        findViewById(R.id.scroll_view).getViewTreeObserver().removeGlobalOnLayoutListener(this);
    }
});

была такая же надоедливая проблема, которая, кстати, не имеет смысла. То, что сработало для меня в конце концов, изменило android:layout_height в теге RelativeLayout в fill_parent такой

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
  ...

надеюсь, что это помогает


Я исправлен вручную установить макет во время onLayout недопустимый вид:

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);

    int rootMarginRight = ((MarginLayoutParams)root.getLayoutParams()).rightMargin;
    int paddingRight = root.getPaddingRight() + rootMarginRight;

    //invalid view
    actionsContainer.layout(
            right - actions.getWidth() - paddingRight,
            0,
            right - paddingRight,
            getHeight()
    );
}

моей проблемой была следующая строка

android:fitsSystemWindows="true" <-- In the parent view
. Добавив его обратно, теперь он работает нормально.