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

时间:2014-06-26 12:22:04

标签: android layout view

使用View衡量view.measure() 常量维度后,getMeasuredHeight()getMeasureWidth()返回0。

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

}

7 个答案:

答案 0 :(得分:9)

当您在view.getMeasuredWidth()onCreate()中致电onCreateView()时,尚未提取view。因此,您需要添加一个侦听器,并在绘制view时获得回调。就像在我的代码中一样:

final 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) {
                vto.removeGlobalOnLayoutListener(this);
            } else {
                vto.removeOnGlobalLayoutListener(this);
            }
        }
    });
}

注意:删除侦听器以获得更好的性能!

请勿调用vto.removeOnGlobalLayoutListener(this)删除侦听器。这样称呼:

vto.getViewTreeObserver()

答案 1 :(得分:4)

您是否在onCreate()中测量视图。该视图尚未绘制。您必须等到视图绘制后的时间才能进行测量。

简单的解决方案是将runnable发布到布局。布局发生后将执行runnable。

了解更多信息See this post

修改 试着改变

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

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

答案 2 :(得分:3)

请尝试这种方式,希望这有助于您解决问题。

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

   }
});

答案 3 :(得分:1)

如果您的测量视图的可见性设置为已消失,则测量将返回0.您可以将其设置为可见,测量,然后设置回去,全部来自代码。

答案 4 :(得分:0)

您无法在View.MeasureSpec.*电话中直接使用measure。而是首先makeMeasureSpec()然后使用它来调用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);

答案 5 :(得分:0)

以防万一有人在使用ImageView时遇到此问题:

我注意到如果你的ImageView没有&#34; android:src&#34; set(即你动态改变它)它总是从getMeasuredWidth / Height返回零。

一个简单的解决方法是为视图设置占位符。

答案 6 :(得分:0)

onCreateView()/onViewCreated()中,您可以使用:

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

然后致电view.control.measuredWidth

在诸如onClick()这样的其他事件中(当视图可见并已测量时),您可以像在{{中一样,直接调用view.control.measuredWidth(不使用view.measure(...))或使用getViewTreeObserver 3}}。