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);//移除监听,防止被重复调用
}
});
在Android开发中,由于布局渲染的异步性质,onCreate方法中直接使用View.getWidth()和View.getHeight()可能无法获取到正确的控件尺寸。文章介绍了两种解决方案:1) 对于Activity,可以利用onWindowFocusChanged方法,在窗口获得焦点时获取尺寸;2) 对于Fragment,可以通过添加OnGlobalLayoutListener监听布局完成,获取尺寸后记得移除监听以避免重复调用。这两个方法确保了在控件尺寸确定后获取其高度和宽度。
4043

被折叠的 条评论
为什么被折叠?



