Дочерний элемент 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>
Если ваш 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
родитель вид.
Я выбираю второй путь. Вот мое решение:
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
. Добавив его обратно, теперь он работает нормально.