2014-06-26 77 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返回零。

一个简单的解决方法是设置一个占位符来查看。

相关问题