2014-06-26 61 views
11

後返回0測量View恆定尺寸view.measure(),所述getMeasuredHeight()getMeasureWidth()將返回0。getmeasuredheight()和getmeasuredwidth()View.measure()

layout_view.xml,佈局後其被充氣到創建視圖

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="100dp" 
    android:layout_height="100dp"> 
</FrameLayout> 

功能,其測量尺寸

public void measureView(Context context){ 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.layout_view,null,false); 

    view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 

    Log.d(TAG,"Error width : " + view.getMeasuredWidth()); 
    Log.d(TAG,"Error heeght : " + view.getMeasuredHeight()); 

} 
+0

看到這個http:// stackoverflow。com/questions/14592930/getwidth-returns-0-if-set-by-androidlayout-width-match-parent –

+0

@GiruBhai我試過使用ViewTreeObserver,它也沒有工作 – SathMK

+0

'View.MeasureSpec。*'不能使用直接在下面查看我的答案。 –

回答

3

試試這個方法,希望這會幫助你解決你的問題。

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
    int width = view.getMeasuredWidth(); 
    int height = view.getMeasuredHeight(); 

    } 
}); 
+0

不,這也是返回0 – SathMK

4

你測量onCreate()視圖。該視圖尚未繪製。您必須等到繪製視圖之後才能測量它。

這個簡單的解決方案是發佈一個可運行的佈局。 runnable將在佈局發生後執行。

欲瞭解更多信息See this post

編輯 嘗試改變

view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 

view.measure(View.MeasureSpec.EXACTLY, View.MeasureSpec.EXACTLY); 
+0

我正在測量onclick方法中的視圖。爲了避免你指出的問題,我用'view.measure()'明確地測量了視圖@ – SathMK

+0

@SathMK嘗試我編輯的答案。 –

+0

我試過這也可能,但仍然結果爲零 – SathMK

0

如果您測量的觀點可見性設置爲不見了,測量將返回0。可以將其設置爲可見,測量,然後設置回去,全部來自代碼。

+0

它被設置爲默認可見 – SathMK

7

當您在onCreate()onCreateView()中致電view.getMeasuredWidth()時,view尚未繪製。所以你需要添加一個監聽器,並且在繪製view時會得到一個回調。就這樣在我的代碼:

ViewTreeObserver vto = view.getViewTreeObserver(); 
if (vto.isAlive()) { 
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int viewWidth = view.getMeasuredWidth(); 
      // handle viewWidth here... 

      if (Build.VERSION.SDK_INT < 16) { 
       v.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } else { 
       v.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } 
     } 
    }); 
} 

注:有更好的表現取出聽衆!

不要致電vto.removeOnGlobalLayoutListener(this)刪除監聽器。這樣稱呼:

v.getViewTreeObserver() 
+0

我試過這個,它似乎在所有測試的情況下都能正常工作,但是現在我看到getMeasuredWidth()在某些用戶的生產中返回0: ( –

+0

)謝謝!我之前使用''''OnPreDrawListener'''(但似乎與某些設備4.4.4和6.0.1不兼容)。使用'''onGlobalLayout'''並在' ''height> 0'''它可以完美運行。 – JCarlos

+0

'v'是什麼?它是從哪裏來的。 –

0

您不能在measure調用中使用那些參數。嘗試使用這樣的:

final int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT/*can be match_parent or some exact value*/, View.MeasureSpec.UNSPECIFIED); 
final int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT/*can be match_parent or some exact value*/, View.MeasureSpec.UNSPECIFIED); 
view.measure(widthMeasureSpec, heightMeasureSpec); 
0

萬一有人遇到此問題的ImageView:

我注意到,如果您的ImageView沒有「機器人:SRC」設置(即動態地改變它)它將始終從getMeasuredWidth/Height返回零。

一個簡單的解決方法是設置一個佔位符來查看。

相關問題