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_widthlayout_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

android中fill_parent和match_parent之间的区别[重复]

FILL_PARENT 和 MATCH_PARENT [重复]