編輯 - >請,這是不是問題爲什麼getWidth()/ getHeight()返回零。什麼時候在View上調用getWidth()/ getHeight()?
我有一個活動內的片段。 我是動態將子視圖(紅色)添加到水平方向的LinearLayout(RowView,藍色),這是Fragment的子項(綠色)。在LinearLayout中添加了多少個子視圖(SubView),在運行時處確定爲。
子視圖必須具有200dp的一個固定的寬度。因此,在動態添加子視圖到Linearlayout時,我想檢查是否有足夠的空間存放另一個子視圖,或者是否需要啓動新的行。 RowView的寬度應該是可變的,並且不一定等於屏幕大小。
爲了檢查是否有足夠的空間,我只需看看所有SubView的組合寬度是否小於Linearlayout的寬度 - 一個SubView的寬度。在我的自定義的LinearLayout(RowView),這看起來如下:
public void addSubView(SubView v) {
int childcount = getChildCount();
int totalChildWidth = 0;
for(int i = 0; i < childcount; i++) {
totalChildWidth += getChildAt(i).getWidth();
}
if(totalChildWidth < getWidth() - 200) { // there is space left in this row
addView(v);
}
}
問題簡單說就是,這getWidth()
的LinearLayout中,並已添加的子視圖getWidth()
返回0,因此,檢查是否有足夠的空間出錯。
其原因是,我打電話getWi'dtdh()時視圖(用戶界面)尚未呈現在屏幕上,所以我的問題是要叫我addSubView(正確的時間時, ) 方法?當前,在創建片段,這顯然是錯誤的,當我稱之爲:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment, container, false);
RowView row = (RowView) v.findViewById(R.id.rowView);
ArrayList<SubView> subViews = DBManager.getSubViewList(); // connects to a database and returns all available subviews
for(int i = 0; i < subViews.size(); i++) {
row.addSubView(subViews.get(i));
}
return v;
}
所以那裏打電話給我addSubView(...)方法,其中,確保了getWidth()
內它不會返回0?一般來說,何時是(根據Activity生命週期的回調方法)getWidth()
或getHeight()
何時被調用,在哪裏確保它們不會返回0?
我迄今爲止嘗試:我RowView的
- 呼叫
addSubView(...)
在碎片onActivityCreated(...)
- >不起作用 - 連接到數據庫的RowViwes內
onSizeChanged(...)
方法,以及所有addSubView(...)
有 - - >不工作 - 做得一樣在上面的代碼來描述,但與500ms的延遲處理程序 - >工作,因爲UI渲染,但不適合我
可能重複的[getWidth和getHeight返回零](http://stackoverflow.com/questions/6145001/getwidth-and-getheight-are-returning-a-zero) – mah
請告訴我答案這個問題向我解釋了什麼時候它是在視圖上調用getWidth()的正確時刻,根據例如活動生命週期? –
從該頁面應該清楚的是,沒有任何與活動生命週期相關的東西使得它適合閱讀佈局,同時在該頁面上使用'onDraw()'(不是該頁面的一部分)建議生命週期)。在這種可能性和你建議的計時器之間(我以前用過成功的計時器),你已經耗盡了可用的操作系統級別改變。 – mah