getmeasuredheight()和getmeasuredwidth()在View.measure()之后返回0

在使用view.measure()测量具有常量维度View之后, getMeasuredHeight()getMeasureWidth()返回0。

layout_view.xml ,这是膨胀创build视图布局

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

测量尺寸的function

 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()); } 

Solutions Collecting From Web of "getmeasuredheight()和getmeasuredwidth()在View.measure()之后返回0"

当您在onCreate()onCreateView()调用view.getMeasuredWidth()时, view尚未绘制。 所以你需要添加一个监听器,并在绘制view时得到一个callback。 就像在我的代码中这样:

 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() 

你在测量onCreate()的视图。 该视图尚未绘制。 您必须等到绘制视图之后才能测量它。

这个简单的解决scheme是发布一个可运行的布局。 可执行文件将在布局发生后执行。

欲了解更多信息, 请参阅此帖

编辑尝试改变

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

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

试试这样,希望这会帮助你解决你的问题。

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

如果您的测量视图的可见性已设置消失,则测量将返回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); 

以防万一有人遇到与ImageView的这个问题:

我注意到,如果你的ImageView没有设置“android:src”(即dynamic改变它),它将始终从getMeasuredWidth / Height返回零。

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