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

  • 在状态栏上方显示视图?
  • Android - 显示View时需要回拨
  • Android:EfficientAdapter与两个不同的视图
  • 如何在Android上自定义视图中心?
  • setvisibility(view.visible)不能在setvisibility(view.gone)之后工作
  • Android:更改button的父视图
  • 列表视图中的项目之间的距离
  • 通过触摸下的观点
  • 当您在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返回零。

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