为什么FOOBAR在没有元素layout_height="fill_parent"
的情况下一直在底部布局,换句话说,所有元素都是高度的wrap_content?
<?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>
答案 0 :(得分:251)
来自RelativeLayout
doc:
课程概述
一种布局,其中儿童的位置可以相互描述或与父母相关。
请注意,您不能在RelativeLayout的大小与其子项的位置之间存在循环依赖关系。 例如,您不能将RelativeLayout的高度设置为WRAP_CONTENT且子级设置为ALIGN_PARENT_BOTTOM
这正是你的情况。 RelativeLayout无法做到这一点。
答案 1 :(得分:50)
对于那些寻求解决方案的人,就像我一样,您可以使用FrameLayout
代替RelativeLayout
。
然后你可以将目标对象的重力设置到右下方,如下所示
<TextView
android:layout_gravity="bottom|right"
android:text="FOOBARZ"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
</TextView>
答案 2 :(得分:21)
您已将RelativeLayout设置为"wrap_content"
和TextView到android:layout_alignParentBottom="true"
,因此它会自动尝试将RelativeLayout拉伸到底部。不要将这种依赖关系与相对布局一起使用,因为它可以算作“循环依赖关系”。
来自the docs for RelativeLayout:
请注意,您不能在RelativeLayout的大小与其子项的位置之间存在循环依赖关系。例如,你不能拥有 RelativeLayout,其高度设置为
WRAP_CONTENT
,子项设置为ALIGN_PARENT_BOTTOM
。
尝试将TextView与父亲RelativeLayout以外的其他内容对齐,但也要注意这个问题:
Circular dependencies, need some help with exact code
或者,尝试添加更复杂的内部布局。
答案 3 :(得分:1)
我不确定为什么干净而且显而易见的实现这一目标的方式还没有发布。这种高性能解决方案适用于任何具有已知高度的View MyView。
在FrameLayout中包裹身高RelativeLayout
的{{1}}:
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来添加填充,或者如果您不担心性能,只需将FrameLayout更改为垂直LinearLayout,即它&# 39;不是列表视图项,或视图相对轻量级。
答案 4 :(得分:0)
好的答案。现在,如果您没有layout_alignParentBottom="true"
并且仍然遇到此问题,请注意android:background="@drawable/bkgnd"
其中bkgnd是一个大问题。
答案 5 :(得分: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>
答案 6 :(得分:0)
FrameLayout
通常适合将不同的视图放在一起(最近的孩子在前一个孩子的顶部)。就您而言,您希望将视图并排放置(上方、下方、开始、结束),因此我认为 ConstrainLayout
更合适,因为它正是这样做的。
与 RelativeLayout
不同的是,您可以将 ConstrainLayout
的宽度设置为 wrap_content
并且仍然可以根据需要排列其子视图,例如代替
android:layout_alignParentTop="true"
你可以使用
grid:layout_constraintTop_toTopOf="parent"
而不是
android:layout_alignParentBottom="true"
你可以使用
grid:layout_constraintBottom_toBottomOf="parent"