Android RelativeLayout奇怪的行为

时间:2012-07-04 17:16:13

标签: android relativelayout

我正在学习相对布局并编写了一个小测试布局来模拟登录页面:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_height="match_parent"
            android:layout_width="match_parent">
    <TextView android:id="@+id/labelUsername"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:text="username:"
          android:layout_centerVertical="true"/>
    <EditText android:id="@+id/txtUsername"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:hint="input username here"
          android:layout_toRightOf="@id/labelUsername"
          android:layout_alignBaseline="@id/labelUsername"/>
    <TextView android:id="@+id/labelPassword"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:text="password:"
          android:layout_below="@id/txtUsername"
          android:layout_alignParentLeft="true"/>
    <EditText android:id="@+id/txtPassword"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:hint="input password here"
          android:layout_below="@id/txtUsername"
          android:layout_alignLeft="@id/txtUsername"
          android:layout_alignBaseline="@id/labelPassword"/>
</RelativeLayout>

我想要的是将Username LabelTextfield放在Password LabelTextField之上。但结果是还原,密码在上面!

我认为问题是labelPassword中的“android:layout_below”属性,如果我将其设置为labelUsername以下,则可行,但是因为textfield比标签大得多,在这种情况下,两个textfields都被覆盖。所以我试着让labelPassword低于txtUsername,但它表现得很奇怪,我不明白。

顺便说一下,当我使用相对布局构建布局时是否有任何指导?

我最初应该放在那里?

我最后应该放什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

要回答您的具体问题,这是因为android:layout_centerVertical="true"规则适用于labelUsername。

当您引用的元素居中时,相对位置似乎不能正常工作。在这种情况下,它也没有意义,因为您可能希望整个表单居中,而不仅仅是用户名字段,然后将密码放在下面。

您可以将元素放在包含元素(另一个相对布局,线性布局或表格布局等)中,并将该元素置于中心。这样可行。或者要将所有内容居中,您可以将android:gravity="center"添加到包含的布局中。

答案 1 :(得分:2)

我认为您在此尝试实现的是尝试将用户名和密码字段垂直居中,并在用户名字段下方输入密码字段。布局中的错误是您只告诉用户名textview和edittext垂直居中,相对布局在布置后将布局中心。因此,您的用户名字段居中,而密码则保留在最顶层。

你应该做的是告诉父母(RelativeLayout)垂直居中所有子元素。

为此,只需从“用户名”TextView元素中删除此属性:

android:layout_centerVertical="true"

并将此属性添加到您的RelativeLayout元素:

android:gravity="center_vertical" //tells RelativeLayout to vertically center all child elements

在这种情况下,我建议使用LinearLayout,但您现在可以继续使用RelativeLayout。希望它有所帮助!

答案 2 :(得分:1)

当您浏览不同的布局时,您会发现,如果您习惯通过CSS定位事物,相对布局感觉最“自然”,例如(具有绝对或相对位置),您在这里描述的情况要求线性或表格布局。对于任何“形式”相关的表格布局可能是你最好的选择。您的表元素(列)应该有一个layout_span属性,该属性详细说明要经过的列数(它类似于HTML中的colspan)。

我不确定上面你的RelativeLayout究竟出了什么问题,我确信通过充分的试验和错误,你可以大致按照你的意愿去做,但我强烈建议你使用正确的工具为了这份工作。

LinearLayout也是一个了不起的工具(您应该记住它可以无限期嵌套)。给你的布局一个weightSum,然后每个项目可以有一个layout_weight(它们应该加起来为总和),而它们的layout_width应该是0dp(它不直观,但它是如何工作的)。这也是让事情符合应有条件的好方法。

最后,RelativeLayout中正确顺序的答案是项目是从下到上排序的Z,因此后一个项目以兄弟顺序出现,其Z顺序越高。否则,他们的订单无关紧要。