13

我有一个用RelativeLayouts 填充的ListView。这些相对布局的内容可以改变,从而分别改变它们的高度。在每个 RelativeLayout 上,我在布局的左侧都有一个与布局高度匹配的小竖线。

与此类似 ->链接

尽管出于某种原因,我使用的 View 对象并没有扩展到布局的高度。

我究竟做错了什么?

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

8 回答 8

25

我的单元格中有一个类似的问题,RecyclerView其中有一个 RelativeLayout 作为根元素。

对我来说,一个解决方法是在根 RelativeLayout 元素周围包裹一个额外的 LinearLayout。

所以你的卡片看起来像这样:

<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

于 2015-11-30T11:32:00.273 回答
19

如果您的 RelativeLayout 在 ScrollView 内,则需要在 ScrollView 上添加 fillViewPort 参数并将其设置为true

  <ScrollView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:fillViewport="true">
于 2017-02-24T00:48:18.773 回答
3

我在 a RelativeLayoutinside a中遇到了类似的问题ScrollView根据文档,如果将其添加到滚动容器(如 ListView)中,则(最高版本 17)中存在一个错误RelativeLayout该错误会导致测量高度错误。

所以要解决这个问题,你应该以编程方式计算高度。

您可以创建扩展类并覆盖该onMeasure方法或将 a 添加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);
    }
});
于 2013-10-29T15:25:33.063 回答
0

I fixed by manually set layout during onLayout for invalid view:

@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()
    );
}
于 2014-07-31T13:56:01.437 回答
0

有同样令人讨厌的问题,顺便说一句没有意义。最后对我有用的是将android:layout_heightRelativeLayout标签中的标签更改为fill_parent这样

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

希望这可以帮助

于 2013-05-25T09:12:07.817 回答
0

如果您知道要设置的确切高度,则可以为此组件(视图)设置 Height 或 MinHeight。在您的情况下,您可以设置为:android:minHeight="76dp",或者您可以使用 LayoutParams 以编程方式设置它。希望能帮助到你!

于 2019-02-24T03:03:48.330 回答
-1

我的问题是以下行

android:fitsSystemWindows="true" <-- In the parent view

去掉了。添加回来后,它现在可以正常工作了。

于 2016-03-04T23:15:07.497 回答
-7

您需要添加layout_alignParentTop="true"and layout_alignParentBottom="true"to status- 这将确保视图同时触及post's的顶部和底部RelativeLayout

于 2013-04-13T21:20:19.477 回答