1

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

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

我想要的是把and放在Username LabelandTextfield之上。但是结果被还原了,密码在上面!Password LabelTextField

我认为问题在于 中的“android:layout_below”属性labelPassword,如果我将其设置为 below labelUsername,它可以工作,但是因为textfield比标签大得多,所以textfields在这种情况下两者都是重叠的。所以我试着做labelPassword下面的txtUsername,但它表现得很奇怪,我不明白。

顺便说一句,当我使用相对布局构建布局时有什么指导方针吗?

我应该先放什么?

最后我应该放什么?

谢谢!

4

3 回答 3

2

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

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

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

于 2012-07-04T17:51:01.820 回答
2

I think what you are trying to achieve here is trying to get both the username and password fields vertically centered, and the password field below the username field. The error in your layout is that you only tell the username textview and edittext to center vertically, and relative layout centeres the layouts after having arranged them. So your username field is centered, while the password is left on top.

What you should do is tell the parent(RelativeLayout) to vertically center all its child elements.

For that simply remove this attribute from the "username" TextView element :

android:layout_centerVertical="true"

And add this attribute to your RelativeLayout element:

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

In this case i would recommend using a LinearLayout but you can continue using RelativeLayout for now. Hope it helps!

于 2012-07-04T18:09:43.133 回答
1

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

我不确定上面的 RelativeLayout 到底出了什么问题,而且我确信通过充分的试验和错误,你可以让它大致完成你想要的,但我强烈建议你使用正确的工具来完成这项工作.

LinearLayout 也是一个很棒的工具(你应该记住它可以无限嵌套)。给你的 Layout 一个 weightSum ,然后每个项目可以有一个 layout_weight (它们应该加起来就是总和),而它们的 layout_width 应该是 0dp (它不直观,但这就是它的工作原理)。这也是让事情放在他们应该在的地方的好方法。

最后,RelativeLayout 中正确顺序的答案是,项目是从下到上按 Z 顺序排列的,因此项目在兄弟顺序中出现的越晚,其 Z 顺序就越高。否则,它们的顺序无关紧要。

于 2012-07-04T17:24:46.390 回答