Android - fill_parent 在RelativeLayout 中的行为不符合预期
Posted
技术标签:
【中文标题】Android - fill_parent 在RelativeLayout 中的行为不符合预期【英文标题】:Android - fill_parent not behaving as expected in RelativeLayout 【发布时间】:2012-06-06 07:37:42 【问题描述】:<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frameLayout1"
android:layout_
android:layout_
android:background="@drawable/background_gradient" >
<RelativeLayout
android:layout_
android:layout_
android:gravity="center" >
<ImageButton
android:id="@+id/buttonLog"
android:layout_
android:layout_
android:background="@drawable/log"
android:onClick="log" />
</RelativeLayout>
</FrameLayout>
我希望我的按钮出现在屏幕中心。但是,它出现在屏幕的 TOP 中心(即按钮水平居中,而不是垂直居中)。
在我看来,RelativeLayout 的行为就像是用“wrap_content”而不是“fill_parent”定义的。
有趣的是,如果我为我的 RelativeLayout 高度属性 (android:layout_height) 赋予一个实际值,例如:
<RelativeLayout
android:layout_
android:layout_
android:gravity="center" >
然后按钮的行为正确(即按钮也垂直居中)。但我不想使用实际值。我想使用fill_parent!为什么它不能与“fill_parent”一起使用??
有人知道怎么回事吗?
提前谢谢你!
【问题讨论】:
【参考方案1】:RelativeLayout 要求您指定元素在 Layout 中的位置。我没有看到任何 layout_below 或 layout_toLeftOf 标签。重力适用于线性布局。一般来说,LinearLayouts 更容易使用,并且它们可以更好地扩展到不同的屏幕尺寸。我建议您将 RelativeLayout 替换为 LinearLayout,并将 FrameLayout 替换为 LinearLayout。如果您想使用多个重叠布局,通常会使用 FrameLayout,但您不会这样做。
我建议您阅读 Android sdk 参考文档中的使用布局,例如:http://bit.ly/djmnn7
【讨论】:
嗯,我之前使用过没有这些属性的RelativeLayouts。但无论如何,从现在开始,我会考虑你的建议。谢谢! (+1)。 所有你可以用RelativeLayouts做的事情你也可以用LinearLayouts做,除了当你有复杂的布局时它会变得复杂。 LL 的优势在于它始终可以在所有设备上很好地扩展。使用具有适当权重的嵌套 LL 来获得您想要的 UI 布局。查看布局宽度、高度和重量的参考文档。【参考方案2】:您为layout_width
和layout_height
指定了fill_parent
RelativeLayout
,因此它填充了它的父视图。
默认情况下,无论您使用fill_parent
作为大小,相对布局都会将其子级排列到左上角。
您应该通过利用 RelativeLayout's
自己的属性集来实现所需的方面,这有助于您将子视图相对彼此或父视图排列:
<ImageButton
android:id="@+id/buttonLog"
android:layout_
android:layout_
android:layout_centerInParent="true"
android:background="@drawable/log"
android:onClick="log" />
使用android:layout_centerInParent
您可以实现这一点。如果此属性设置为 true,则该子项在其父项中水平和垂直居中。
【讨论】:
嗨 rekaszeru。感谢回复。我知道默认情况下,相对布局将从左上角开始排列其子级。但是,这正是我在该 RelativeLayout 中设置 android:gravity="center" 属性的原因,因此它的子项居中(但事实并非如此)。你能解释一下为什么 center 属性在这里没有做任何事情吗? 请看这个解释:***.com/a/6819801/506879 也看看RelativeLayout's
属性:developer.android.com/reference/android/widget/… 没有gravity
属性。
哇!没有重力属性......我实际上使用了Eclipse的代码完成,当我点击(Ctrl +空格)时,它确实向我展示了相对布局的重力属性。一旦 Google 完成了这项工作(并且它最近被合并到 Android 插件中),我最起码的期望是它是正确的......我想那时我不能依赖 Eclipse 的建议。我将始终检查网站上的文档。我不得不说这很烦人......谢谢你的帮助rekaszeru!以上是关于Android - fill_parent 在RelativeLayout 中的行为不符合预期的主要内容,如果未能解决你的问题,请参考以下文章
Android - fill_parent 在RelativeLayout 中的行为不符合预期
Android布局中match_parent和fill_parent的差别
android中的fill_parent和match_parent有啥区别[重复]
android中的wrap_content,match_parent, fill_parent