Android动态获取控件的长宽度
如果要获取一个控件的高度通过在oncreate中View.getWidth和View.getHeight是无法获得一个view的高度和宽度,因为view的组件布局要的onResume回调后完成。
1.Activity获取
Activity可以通过在onWindowFocusChanged(boolean hasFocus)这个方法中获得控件的大小,当前窗口的Activity在获得或者失去焦点的时候就会调用这个方法,它是这个Activity是否对用户可见的最好标志。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
//view为所要获取高度和宽度的控件
int height = view.getHeight();
int width = view.getWidth();
}
2.Fragment获取
fragment不同于activity,因为fragment没有onWindowFocusChanged该方法,不过fragment可以通过可以通过控件调用getViewTreeObserver.addOnGlobalLayoutListener()来获取,ViewTreeObserver是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知,所以在注册过后,当不在调用时需要移除监听,否则会被重复调用。
//view为所要获取的控件
ViewTreeObserver observer = view.getViewTreeObserver();
observer.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int height = view.getHeight();
int width = view.getWidth()
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);//移除监听,防止被重复调用
}
});