2012-02-10 33 views
3

我在將某些東西添加到RelativeLayout時會調用什麼序列的問題。我有一個類擴展活動(命名爲RelActivity),我想創建一個RelativeLayout並將幾個自定義視圖(將其命名爲cusView)放入該RelativeLayout。自定義視圖的topMargin和leftMargin通過使用另一個自定義視圖的位置來計算(即,第一個自定義視圖必須通過將數字設置爲topMargin和leftMargin直接定位)。請注意,在這種情況下RelativeLayout規則是不夠的。何時Android視圖集的寬度?

因此,結束了這個問題。在我RelActivity我這樣做:

  1. 創建cusViews光標從數據庫
  2. 收到對於第一cusView一個RelativeLayout的(其命名爲relLayout)
  3. 迭代 - >通過TOPMARGIN和LEFTMARGIN設置位置使用LayoutParameter
  4. 對於其他cusViews - >使用其他cusViews之一和LayoutParameter計算它們TOPMARGIN和LEFTMARGIN
  5. 集RelActivity的對內容查看relLayout

會發生什麼情況是,所有cusViews,但第一個cusView擠在左上角,因爲leftMargin和topMargin都始終計算爲零。發生這種情況是因爲我使用cusViews的寬度來計算topMargin和leftMargin,並且cusView的寬度尚未給出值。

寬度首先在cusView的覆蓋方法onSizeChanged()中計算?當佈局出現在屏幕上時,是否首先調用onSizeChanged()方法?如果是這樣,我該如何解決這個問題?我必須在onSizeChanged()完成後計算位置嗎?

編輯:這是一個最低工作例如:

這是我的onCreate在RelActivity:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    relLayout = new RelativeLayout(this); 
    cusViews = new ArrayList<CusView>(); 
    listParams = new ArrayList<RelativeLayout.LayoutParams>(); 

    readDBandSetLayout(); 

    setContentView(relLayout); 
} 

有一個在readDBandSetLayout()方法,太多的信息在這裏展示這一切。以下是最重要的細節。如果我創建以下列方式它工作正常的的LayoutParams中,cusViews向下和向右上市海誓山盟:

queryCursor = customApplication.customData.query(number); //Fetches cursor 

for (int i = 0; i < numberOfRows; i++){ 

     if (i == 0){ 
      LayoutParams p = new LayoutParams(this.getResources().getDimensionPixelSize(R.dimen.small), this.getResources().getDimensionPixelSize(R.dimen.small)); 
      p.topMargin = 50; 
      p.leftMargin = 50; 
      listParams.add(p); 
     } 
     else{ 
      LayoutParams p = new LayoutParams(this.getResources().getDimensionPixelSize(R.dimen.large),this.getResources().getDimensionPixelSize(R.dimen.large)); 
      p.addRule(RelativeLayout.BELOW, cusViews.get(i-1).getId()); 
      p.addRule(RelativeLayout.RIGHT_OF, cusViews.get(i-1).getId()); 
      listParams.add(p); 
     } 

    relLayout.addView(cusViews.get(i), listParams.get(i)); 
} 

不過,我想在else語句做的是一樣的東西:

else{ 
     LayoutParams p = new LayoutParams(this.getResources().getDimensionPixelSize(R.dimen.large),this.getResources().getDimensionPixelSize(R.dimen.large)); 

//Here I want to calculate cusView2Topmargin and cusView2Leftmargin based on the widths of the first or previosly positioned cusViews. But here the widths are 0 since they haven't been calculated yet. 

     p.topMargin = cusView2Topmargin; //Always zero 
     p.leftMargin = cusView2Leftmargin; //Always zero 
     listParams.add(p); 
      } 

所以問題在於cusViews的寬度在我需要它們計算佈局參數topMargin和leftMargin的點爲零。

不幸的是,我不能使用RelativeLayout的規則來實現我想要的。如果有一些方法可以創建像RelativeLayout.RIGHT_OF和RelativeLayout.BELOW這樣的規則,我可以這樣做。這可能嗎?

+0

您的一般方法是可以的(假設相對佈局或其他任何一個都不夠用,這是非常罕見的情況)。我打賭你是做某事的。設置LayoutParams時出錯,這部分可能會變得棘手,而且過去我也遇到過類似的問題。請提供一些代碼示例,我們將看看我們可以做些什麼。 – 2012-02-10 18:59:58

+0

我添加了一些工作代碼。希望足夠了解這個問題。你知道是否有可能創建我自己的RelativeLayout規則?這可能會解決這個問題,因爲使用這些規則確實有效。 – 2012-02-10 19:23:57

回答

1

它不是很清楚你的目標是什麼佈局。使用一個簡單的LinearLayout來獲得你想要的結果是可能的。

如果你想大小這些從數據庫中查找,然後儘量簡單地增加各的意見,使用addView()第一,存儲到每個參考,然後回去SETT利潤率將它們放置在適當的位置。

+0

注意:您試圖強制_absolute_視圖方法進入_relative_視圖。如果你分享你的最終佈局應該是什麼樣子的目標,可能有更好的方法來做到這一點。 – PaulP 2012-02-10 21:37:08

+0

我一直在研究這一點,並相信LinearLayout是最好的選擇。正如你所說,我正在試圖從相對觀點強制絕對觀點。另一種方法可以是使用GridLayout,儘管我自己並沒有嘗試過。 – 2012-03-14 18:48:05

相關問題