Android - fill_parent在RelativeLayout中的行为不符合预期

时间:2012-06-01 03:07:14

标签: android layout button center relativelayout

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frameLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/background_gradient" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center" >

        <ImageButton
            android:id="@+id/buttonLog"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/log"
            android:onClick="log" />

    </RelativeLayout>

</FrameLayout>

我希望我的按钮出现在屏幕的中心。但是,它出现在屏幕的TOP中心(即按钮水平居中,但不是垂直居中)。

在我看来,RelativeLayout的行为就像用“wrap_content”而不是“fill_parent”定义的那样。

有趣的是,如果我给我的RelativeLayout高度属性(android:layout_height)赋予实际值,例如:

<RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="100dp"
        android:gravity="center" >

然后按钮表现正确(即按钮也垂直居中)。但我不想使用实际值。我想用fill_parent!为什么它不适用于“fill_parent”??

有人知道发生了什么吗?

提前谢谢!

2 个答案:

答案 0 :(得分:4)

RelativeLayout要求您指定布局中元素的位置。我没有看到任何layout_below或layout_toLeftOf标签。重力适用于LinearLayouts。通常,LinearLayouts更易于使用,并且它们可以更好地扩展到不同的屏幕尺寸。我建议你用LinearLayout替换RelativeLayout,用LinearLayout替换FrameLayout。如果要使用多个重叠布局,则通常使用FrameLayout。

我建议您仔细阅读Android sdk参考文档中的布局,例如:http://bit.ly/djmnn7

答案 1 :(得分:1)

您为fill_parent的{​​{1}}和layout_width指定了layout_height,因此它填写了它的父视图。 默认情况下,无论您使用RelativeLayout大小,相对布局都会将其子项排列到左上角。

您应该利用fill_parent自己的属性集来实现所需的方面,这有助于您将子视图相对安排到彼此或其父级:

RelativeLayout's

使用<ImageButton android:id="@+id/buttonLog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="@drawable/log" android:onClick="log" /> 即可实现此目的。如果此属性设置为true,则将此子项水平和垂直居中于其父级。