2011-06-21 167 views
16

如果父級是PopupWindow而非ViewGroup,如何計算充氣View的寬度和高度?我不能用LayoutInflator.inflate(int resId, ViewGroup parent, attachToRoot boolean)因爲PopupWindow不是一個ViewGroup中,所以我用LayoutInflator.inflate(int resId)代替,但我的getWidth()和getHeight()之後返回零:(如何獲取或計算充氣視圖的寬度/高度

我需要調整PopupWindow以適應瀏覽,但不能做所以直到查看有父,我是否有雞還是先有蛋的問題?

順便說視圖是RelativeView的一個子類,所以計算是手動本質上出了問題。

謝謝前進, Barry

+0

您能得到您的視圖的維度,attachToRoot布爾)'? –

回答

17

其實popupWindow支持 「包裝內容」 的constans,所以如果你想彈出確切作爲您的視圖 - 使用此:

popup = new PopupWindow(context); 
popup.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); 
popup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); 

- 其他選項 -

getWidth()並且getHeight()返回零,因爲視圖在屏幕上繪製後纔有大小。您可以嘗試從充氣視圖獲得LayoutParams的值。如果有fill_parent價值 - 你是在雞蛋雞的情況。

如果在pxdp值可以手動在像素計算尺寸:

Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpSize, context.getResources().getDisplayMetrics())); 

如果有wrap_content值 - 你可以使用view.measure()方法 - 所有兒童和查看本身將被測量,並且你可以得到view.getMeasuredHeight()view.getMeasuredWidth()

+0

的問題是的,我正在使用fill_parent。我使用PopupWindow大小的計算值(顯示寬度 - 填充)結束。它工作得很好。 –

-3

請試試這個:

Display display = getWindowManager().getDefaultDisplay(); 
Log.e("", "" + display.getHeight() + " " + display.getWidth()); 
+1

我需要我的視圖的寬度和高度,而不是顯示器。 –

+1

我一直在尋找這個,謝謝! – paiego

+1

這不回答OP – Gerard

6

正如Jin35所說,你的問題是視圖的寬度和高度還沒有被計算出來......直到佈局通過之後纔會計算出這些尺寸。

從維度資源(例如來自values/dimens.xml文件)使用固定寬度和高度是一種解決方法,因爲您不需要等待視圖的onMeasure發生 - 您可以獲取值與您感興趣的視圖使用的維度資源相同,並使用它。

更好的解決方案是延遲計算,直到onMeasure發生。你可以做到這一點通過重寫onMeasure,而是一個更優雅的解決方案是使用臨時OnGlobalLayoutListener這樣的:調用`LayoutInflator.inflate(INT渣油,父母的ViewGroup後

View popup = LayoutInflator.inflate(int resId); 
if(popup != null) { 

    // set up an observer that will be called once the listView's layout is ready 
    android.view.ViewTreeObserver viewTreeObserver = listView.getViewTreeObserver(); 
    if (viewTreeObserver.isAlive()) { 

     viewTreeObserver.addOnGlobalLayoutListener(new android.view.ViewTreeObserver.OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 

       //Log.v(TAG, "onGlobalLayoutPondYouOldPoop"); 

       // This will be called once the layout is finished, prior to displaying. 

       View popup = findViewById(resId); 

       if(popup != null) { 
        int width = popup.getMeasuredWidth(); 
        int height = popup.getMeasuredHeight(); 

        // don't need the listener any more 
        popup.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       } 
      } 
     }); 
    } 
} 
相關問題