RelativeLayout正在全屏显示wrap_content


126

当没有元素layout_height="fill_parent"换句话说,所有元素都是高度的wrap_content时,为什么FOOBARZ会一直在底部进行布局? 在此处输入图片说明

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/feed_u"
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:layout_marginLeft="5dip"
        android:scaleType="centerCrop"
        android:drawableTop="@android:drawable/presence_online"
        android:text="U" />
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/feed_u">
        <ImageView
            android:id="@+id/feed_h"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/btn_minus" />
        <ImageView
            android:id="@+id/feed_ha"
            android:layout_toLeftOf="@id/feed_h"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/btn_plus" />
        <TextView
            android:id="@+id/feed_t"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Title">
        </TextView>
        <TextView
            android:id="@+id/feed_a"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Band"
            android:layout_below="@id/feed_t">
        </TextView>
        <TextView
            android:id="@+id/feed_s"
            android:layout_below="@id/feed_a"
            android:text="S"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </TextView>
        <TextView
            android:id="@+id/feed_tm"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="FOOBARZ"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </TextView>

    </RelativeLayout>
</RelativeLayout>

1
hierarchyviewer在Eclipse中使用或Hierarchy View透视图确定问题出在哪里:developer.android.com/guide/developing/debugging/…–
CommonsWare

Eclipse内部的层次结构视图透视图在哪里?哪个屏幕?
hunterp 2011年

1
窗口>打开透视图>其他...-尽管我想您已经有了@alextc的回答。
CommonsWare

@CommonsWare我已经找到它了,但是它是空白的,我怎样才能实际加载一个布局呢?
hunterp 2011年

Answers:


266

RelativeLayout文档中:

类概述

可以相对于彼此或相对于父项描述子项位置的布局。

请注意,RelativeLayout的大小与其子位置之间不能具有循环依赖关系。例如,您不能将RelativeLayout的高度设置为WRAP_CONTENT,将其子级设置为ALIGN_PARENT_BOTTOM

类文档

这正是您的情况。RelativeLayout无法做到这一点。


3
因此,我删除了align_parentBottom,现在布局只是屏幕的1/10,应该如何将FOOBARZ放在其底部?
hunterp 2011年

2
只需简短看一下,我就会说:拿起FOOBARZ文本视图,将其移到外部RelativeLayout并设置android:layout_below =“ @ id / feed_u”。我不确定这是否是您想要的强项。

您是否尝试过为相对布局分配固定的高度(例如android:layout_height="200dp",这将允许您使用android:layout_alignParentBottom="true"
gfrigon 2012年

1
请注意,当使用大的可绘制对象作为背景时,也会发生这种情况。要解决此问题,请将主要内容拉入子布局,然后将背景作为<ImageView>其后面的同级对象。
Ben Leggiero

1
我注意到,孩子们也不会允许使用layout_heightmatch_parent
丹尼尔˚F

52

对于像我一样寻求解决方案的用户,可以使用FrameLayout代替RelativeLayout

然后您可以将重力物体设置为右下方,如下所示

<TextView
    android:layout_gravity="bottom|right"
    android:text="FOOBARZ"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
</TextView>

使用FrameLayout是一个很好的解决方案。如果此布局中有更多组件,则必须设置边距以避免重叠。
维罗妮2015年

23

您已将RelativeLayout设置为"wrap_content" ,将TextView设置为android:layout_alignParentBottom="true",因此它会自动尝试将RelativeLayout拉伸到底部。不要在Relative Layout中使用此类依赖项,因为它可以算作“循环依赖项”。

RelativeLayout的文档中

请注意,RelativeLayout的大小与其子位置之间不能具有循环依赖关系。例如,您不能将RelativeLayout的高度设置为WRAP_CONTENT,将子级设置为ALIGN_PARENT_BOTTOM

尝试将TextView对齐到父级RelativeLayout以外的其他位置,但也要注意此问题:
循环依赖项,需要一些有关确切代码的帮助

或者,尝试添加更复杂的内部布局。


2
顺便说一句,我认为在运行时-即使使用“ android:layout_alignParentBottom =” true“”,您的代码也将按需要显示。看来,Android在运行时对此情况进行了一些其他解析,并正确显示了它。您应该尝试运行您的应用程序。
Dirol 2011年

0

好答案。现在,如果您没有layout_alignParentBottom="true"并且仍然遇到此问题,请注意android:background="@drawable/bkgnd"bkgnd在哪里很重要。


0

我不确定为什么尚未发布干净明显的方法来实现此目的。该高性能解决方案适用于任何已知高度的View MyView。

将您RelativeLayout的身高包裹wrap_content在FrameLayout中:

<!-- width here should constrain RelativeLayout -->
<FrameLayout 
     android:layout_width="@dimen/my_layout_width"
     android:layout_height="wrap_content">

     <RelativeLayout  
          android:layout_width="match_parent"
          android:layout_height="wrap_content" />

     <MyView
        ...
        android:layout_gravity="bottom" />
</FrameLayout>

只需注意,FrameLayout底部的视图将位于RelativeLayout内容的顶部,因此您需要在该布局的底部添加填充以使其适应。如果您希望该视图具有可变高度,则可以将FrameLayout子类化以基于所测得的视图高度在代码中添加填充,或者如果您不担心性能(即,它不是列表视图),则只需将FrameLayout更改为垂直LinearLayout即可。项,或者视图相对较轻。


0

不要在子视图中使用alight_Parent类型属性

您可以使用框架布局代替具有相应重力的RelativeLayout

    <FrameLayout
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
     <TextView
        android:layout_gravity="bottom|right"
        android:text="Hello "
        android:layout_height="wrap_content"
        android:layout_width="wrap_content">

    </TextView>

</FrameLayout>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.