2012-02-19 66 views
9

我在我的應用程序中廣泛使用RelativeLayouts,並認爲我知道如何指定它們,但這讓我無所適從。我基本上將4個TextView定位在兩行中,每行兩個,每個都包含一個將提供的標籤和文本。它應該是這個樣子:Android layout_below不工作

出生:1810年8月23日梅森有限公司,肯塔基

卒於:1865年7月15日辛辛那提,漢密爾頓有限公司,俄亥俄州

這是佈局的相關部分:

 <TextView android:id="@+id/birth_lbl" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/given_layout" 
      android:layout_alignLeft="@+id/given_layout" 
      android:layout_marginTop="6dip" 
      style="@style/label" 
      android:text="@string/born" 
     /> 
     <TextView android:id="@+id/birth" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_toRightOf="@+id/birth_lbl" 
      android:layout_alignBaseline="@+id/birth_lbl" 
      android:layout_marginLeft="10dip" 
      android:layout_marginRight="6dip" 
      style="@style/main_text" 
      android:text="dd Mmm yy" 
     /> 
     <TextView android:id="@+id/death_lbl" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/birth" 
      android:layout_alignLeft="@+id/birth_lbl" 
      android:layout_marginTop="4dip" 
      style="@style/label" 
      android:text="@string/died" 
     /> 
     <TextView android:id="@+id/death" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_toRightOf="@+id/death_lbl" 
      android:layout_alignLeft="@+id/birth" 
      android:layout_alignBaseline="@+id/death_lbl" 
      android:layout_marginRight="6dip" 
      style="@style/main_text" 
      android:text="dd Mmm yy" 
     /> 

由於某些原因,這會顯示死亡線視圖ABOVE出生線視圖!如果我將death_lbl視圖的規範更改爲'layout_below =「@ + id/birth_lbl」',則行的位置正確!但是,「出生」視圖可能包含多行,所以我真的需要將第二行放在「出生」下面,而不是「birth_lbl」。

任何人都知道這種行爲的原因?它既出現在Eclipse的圖形佈局編輯器中,也出現在運行Android 4.0的平板電腦的運行時。

+1

在'id'聲明中的'+'標記應僅在'id'的第一外觀使用。您應該編輯併發布完整的佈局文件以查看您使用的額外視圖('given_layout'?)。我在模擬器中嘗試了它,併爲我的工作,但當然,我沒有額外的'given_layout'視圖。 – Luksprog 2012-02-19 19:07:15

+0

因爲像Slukian說的那樣,你甚至不知道自己在做什麼......不管你想要什麼,都要停止使用'+',並且試着考慮你所擁有的每個+就像創造一個新的變量......它甚至很漂亮奇怪的是,編譯器並沒有對此說一句話...... – Cehm 2012-02-19 19:12:32

+2

這裏更溫柔!當您使用「設計」時,android 21編譯器會將這些加入。我們提出問題的原因是,正如你所說,我們不知道。 – user462990 2015-01-05 17:10:39

回答

13

嘗試death_lbl改變android:layout_below="@+id/birth"android:layout_below="@id/birth",因爲此時它已經宣佈,該+暗示,它可能再次聲明,當它導致的問題。

+0

謝謝。我實際上知道這一點,你在我的示例代碼中看到的是我在絕望中嘗試的東西:-)。我把它放回原來的結果。 – gordonwd 2012-02-19 23:51:11

+0

但是當我這樣做時,它不工作,當把+,它是工作的,爲什麼? – 2012-10-29 06:15:46

0

你的問題是,你正在調用相對佈局的屬性,就好像你再次聲明它一樣。

當你聲明的ID爲視圖那麼就應該像這樣android:id="@+id/button" 和做的時候,你希望Android位置的上方或下方的任何其他觀點,即特定視圖在一個相對佈局,你必須這樣稱呼它android:layout_below="@id/textview"

這告訴你聲明的ID按鈕一個按鈕,並希望將其定位在TextView的下方,切記不要用@+id到現在的位置視圖使用@id,而不是機器人。

+0

看到我上面的評論。謝謝! – gordonwd 2012-02-19 23:51:31

+1

這不完全正確。如果您有一個視圖或視圖組在xml中聲明的另一個視圖或視圖組,但要用於示例toRightOf或toLeftOf,則可以使用@ + id引用下面的視圖,然後再使用@ + id或@id來設置視圖/視圖組本身。 @ + id將ID添加到您的R,然後插入到它建立應用程序時,它也涉及的視圖。 – speedynomads 2013-05-30 13:32:30

+0

@ domji84你錯了,你不能通過使用@ + id來引用視圖或事實上的任何資源,它的唯一目的是創建新的資源。看到這個答案http://stackoverflow.com/a/5025971/892055 – 2013-05-30 17:30:36

1

如果修理你+跡象沒有幫助,你總是可以定位你的id/death下面id/birth,然後把id/death_label toLeftOf id/death

+0

試過了,它只是不喜歡把任何東西放在該ID /出生視圖。在繼續討論這個問題之前,我會嘗試在一個單獨的文件中編寫一個更孤立的案例。謝謝! – gordonwd 2012-02-19 23:52:39

1

我實際上能夠通過編碼一個臨時layout而僅使用那些字段來複制這種現象,並且能夠確定問題消失了,如果我沒有將最初的birth_lbl視圖相對於其上面的視圖(「 given_layout「)。

所以我不知道如果這被列爲一個解決方法,一種解決方法,或者雜牌(是仍然是一個字,這些天?),但我做的是對文本視圖定位自身RelativeLayout內,將RelativeLayout相對於id/given_layout。在任何情況下,它的工作原理...

2

因爲我用約束的佈局,我也面臨着同樣的問題,但align_below只在相對佈局工作。所以請檢查您正在使用的佈局。