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

来源:互联网 发布:python gb2312转utf8 编辑:程序博客网 时间:2024/06/08 15:18

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

我们知道在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());            }        });    }}

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

原创粉丝点击