Child of RelativeLayout is not filling the height of the RelativeLayout

If your RelativeLayout is inside a ScrollView, then on the ScrollView you need to add the fillViewPort param and set it to true

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

I had a similar issue inside the cells of my RecyclerView which had a RelativeLayout as root element.

A workaround for me was wrapping an extra LinearLayout around the root RelativeLayout element.

So you card looks like this:

<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>

Source: https://stackoverflow.com/a/28799251/3708094


I had a similar problem with a RelativeLayout inside a ScrollView. According to the documentation there is a bug in RelativeLayout (up to version 17) that cause mistakes in measured height if it is added inside scrolling container (like ListView).

So to solve the problem you should calculate height programmatically.

You could make your extended class and override the onMeasure method or add a OnGlobalLayoutListener to the parent view.

I choose the second way. Here is my solution:

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);
    }
});