获取一个控件的高度与宽度的正确方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013293125/article/details/77096530

获取一个控件的高度与宽度的正确方法

我们知道在oncreate中View.getWidth和View.getHeight无法获得一个view的高度和宽度,这是因为View组件布局要在onResume回调后完成。很多人认为,View.measure(0,0),然后调用view.getMeasureHeight和view.getMeasureWidth就可以获取控件的高度与宽度,事实是这样么?没有试验就没有发言权,下面我们来测试一下。

activity_main.xml代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="500dp"
    android:layout_height="500dp"
    android:orientation="horizontal"
     >

</LinearLayout>

MainActivity.java代码:

package com.example.androidtest2_2_2_1;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
    private LinearLayout ll;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ll = (LinearLayout) findViewById(R.id.container);
        ll.measure(0,0);
        int height = ll.getMeasuredHeight();
        int width = ll.getMeasuredWidth();
        Log.e("测试:", width+","+height);
    }
}

结果截图:
这里写图片描述

我们看到结果截图显然不能得到我们想要的东西的,说明该写法也是不行的。

下面还有一个方法,也是网上看到的,先看下代码。
MainActivity.java代码:

package com.example.androidtest2_2_2_1;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
    private LinearLayout ll;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ll = (LinearLayout) findViewById(R.id.container);

        int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.EXACTLY);
        int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.EXACTLY);
        ll.measure(w,h);
        int height = ll.getMeasuredHeight();
        int width = ll.getMeasuredWidth();
        Log.e("测试:", width+","+height);
    }
}

结果截图:
这里写图片描述

上面我用的是View.MeasureSpec.EXACTLY,因为我的LinearLayout的高度和宽度用的都是精确值。从结果来看,该方法显然是不行的。

目前,还有一种方法是可行的,就是用addOnGlobalLayoutListener来获取控件的高度与宽度,因为该方法默认是被调用两次,所以调用一次后需要移除该监听。

MainActivity.java代码:

package com.example.androidtest2_2_2_1;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
    private LinearLayout ll;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ll = (LinearLayout) findViewById(R.id.container);

        ll.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {
                // TODO Auto-generated method stub
                ll.getViewTreeObserver().removeGlobalOnLayoutListener(this);

                Log.e("测试:", ll.getMeasuredHeight()+","+ll.getMeasuredWidth());
            }
        });
    }
}

运行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u013293125/article/details/77096530