1

編輯 - >請,這是不是問題爲什麼getWidth()/ getHeight()返回零。什麼時候在View上調用getWidth()/ getHeight()?

我有一個活動內的片段。 我是動態將子視圖(紅色)添加到水平方向的LinearLayout(RowView,藍色),這是Fragment的子項(綠色)。在LinearLayout中添加了多少個子視圖(SubView),在運行時處確定爲

enter image description here

子視圖必須具有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渲染,但不適合我
一個妥善的解決辦法
+0

可能重複的[getWidth和getHeight返回零](http://stackoverflow.com/questions/6145001/getwidth-and-getheight-are-returning-a-zero) – mah

+0

請告訴我答案這個問題向我解釋了什麼時候它是在視圖上調用getWidth()的正確時刻,根據例如活動生命週期? –

+0

從該頁面應該清楚的是,沒有任何與活動生命週期相關的東西使得它適合閱讀佈局,同時在該頁面上使用'onDraw()'(不是該頁面的一部分)建議生命週期)。在這種可能性和你建議的計時器之間(我以前用過成功的計時器),你已經耗盡了可用的操作系統級別改變。 – mah

回答

1

您嘗試執行的操作不起作用,因爲在想要知道元素寬度的時刻,佈局未完成。有兩種解決方案。第一個是確定你的佈局,這是緩解你的情況,因爲它是實際的屏幕寬度的實際寬度:

int width = getActivity().getResources().getDisplayMetrics().widthPixels 

使用此值,以確定有多少你的子視圖,你可以在一個加行通過轉換200dp成像素:

int viewWidth = (int) (200 * (getActivity().getResources().getDisplayMetrics().densityDpi/160f)); 

然後就可以計算的觀看次數的行的最大數量:

int maxViewsToAdd = (int) width/viewWidth; 

另一解決方案是一個globalLayoutListener,你可以找到一個描述here。但是這似乎不適用於所有情況。

+0

我知道這一點,請閱讀我的完整問題。 –

+0

對不起,我編輯了我的答案。 ^^ – Baschi

相關問題