我正在学习相对布局并编写了一个小测试布局来模拟登录页面:
<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 Label
和Textfield
放在Password Label
和TextField
之上。但结果是还原,密码在上面!
我认为问题是labelPassword
中的“android:layout_below”属性,如果我将其设置为labelUsername
以下,则可行,但是因为textfield
比标签大得多,在这种情况下,两个textfields
都被覆盖。所以我试着让labelPassword
低于txtUsername
,但它表现得很奇怪,我不明白。
顺便说一下,当我使用相对布局构建布局时是否有任何指导?
我最初应该放在那里?
我最后应该放什么?
谢谢!
答案 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顺序越高。否则,他们的订单无关紧要。