获取一个控件的高度与宽度的正确方法
我们知道在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());
}
});
}
}
运行结果: