我在將某些東西添加到RelativeLayout時會調用什麼序列的問題。我有一個類擴展活動(命名爲RelActivity),我想創建一個RelativeLayout並將幾個自定義視圖(將其命名爲cusView)放入該RelativeLayout。自定義視圖的topMargin和leftMargin通過使用另一個自定義視圖的位置來計算(即,第一個自定義視圖必須通過將數字設置爲topMargin和leftMargin直接定位)。請注意,在這種情況下RelativeLayout規則是不夠的。何時Android視圖集的寬度?
因此,結束了這個問題。在我RelActivity我這樣做:
- 創建cusViews光標從數據庫
- 收到對於第一cusView一個RelativeLayout的(其命名爲relLayout)
- 迭代 - >通過TOPMARGIN和LEFTMARGIN設置位置使用LayoutParameter
- 對於其他cusViews - >使用其他cusViews之一和LayoutParameter計算它們TOPMARGIN和LEFTMARGIN
- 集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這樣的規則,我可以這樣做。這可能嗎?
您的一般方法是可以的(假設相對佈局或其他任何一個都不夠用,這是非常罕見的情況)。我打賭你是做某事的。設置LayoutParams時出錯,這部分可能會變得棘手,而且過去我也遇到過類似的問題。請提供一些代碼示例,我們將看看我們可以做些什麼。 – 2012-02-10 18:59:58
我添加了一些工作代碼。希望足夠了解這個問題。你知道是否有可能創建我自己的RelativeLayout規則?這可能會解決這個問題,因爲使用這些規則確實有效。 – 2012-02-10 19:23:57