2012-07-04 108 views
1

我學習相對佈局,並寫了一個小測試佈局模擬登錄頁面:的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 LabelTextfieldPassword LabelTextField上面有什麼。但結果被還原,密碼在上面!

我認爲這個問題是「機器人:layout_below」在labelPassword屬性,如果我將它設置爲低於labelUsername,它的工作原理,但由於textfield比標籤更大,兩者textfields在這種情況下覆蓋。所以我儘量使labelPassword低於txtUsername,但它表現奇怪,我不明白。

順便說一句,當我使用相對佈局構建佈局時,是否有任何指導原則?

我應該先在那裏放什麼?

我最後應該放什麼?

謝謝!

+3

爲什麼使用相對佈局當這顯然是tablelayout的一項工作? – Merlin

回答

2

我想你在這裏試圖實現的是試圖讓用戶名和密碼字段垂直居中,密碼字段在用戶名字段下面。佈局中的錯誤是,您只能將用戶名textview和edittext命名爲垂直居中,相對佈局會在佈置佈局後對其進行佈局。所以你的用戶名字段居中,而密碼保留在最上面。

你應該做的是告訴父母(RelativeLayout)垂直居中所有子元素。

對於簡單地從「用戶名」 TextView元素中刪除該屬性:

android:layout_centerVertical="true" 

而這個屬性添加到您的RelativeLayout元素:

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

在這種情況下,我會建議使用LinearLayout但您現在可以繼續使用RelativeLayout。希望能幫助到你!

1

當您瀏覽不同的佈局時,您會發現,如果您習慣通過CSS定位事物,相對佈局感覺最「自然」,例如(絕對或相對位置)您描述的情況這裏需要線性或表格佈局。表格佈局可能是您與任何「形式」相關的最佳選擇。你的表格元素(列)應該有一個layout_span屬性,它詳細說明了需要經過多少列(這與HTML中的colspan類似)。

我不確定在上面的RelativeLayout中有什麼特別的問題,我敢肯定,通過充分的試驗和錯誤,你可以大致得到你想要的結果,但我強烈建議你使用正確的這項工作的工具。

LinearLayout也是一個了不起的工具(你應該記住可以無限期地嵌套)。給你的佈局一個weightSum,然後每個項目可以有一個layout_weight(他們應該加起來作爲總和),而他們的layout_width應該是0dp(這不是直觀的,但它是如何工作的)。這也是讓事情坐在他們應該坐的地方的好方法。

最後,在RelativeLayout中對正確順序的回答是,這些項目是Z從底部到頂部排序的,所以後面的項目出現在兄弟順序中,Z順序越高。否則,他們的順序是不相關的。

2

要回答您的具體問題,這是因爲您要應用於labelUsername的android:layout_centerVertical="true"規則。

看起來,相對位置不能很好地工作,當你引用的元素居中。在這種情況下,這也是沒有意義的,因爲您可能希望整個表單居中,而不僅僅是用戶名字段,然後將密碼放在下面。

您可以將元素放入包含元素(另一個相對佈局,線性佈局或表格佈局等)中,並將該元素居中。這樣可行。或者將所有內容居中,您可以將android:gravity="center"添加到包含的佈局。