View 的宽高的获取
2015-12-16 10:08
281 查看
View的measure过程和Activity的生命周期是异步执行的所以一般在onResume中获取的宽高都为0
下面有四个方法解决这个问题1. Activity/View#onWindowFousChanged
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(hasFocus){ int with=view.getMeasureWidth(); int height=view.getMeasureHeight(); } }
当Activity的窗口得到焦点和失去焦点时会被调用一次
.
2. view.post(runnable)
通过post可以将一个runnable投递到消息队列的尾部,然后等待Looper调用此runnable的时候,View也已经初始化好了。
view.post(new Runnable() { @Override public void run() { int with=view.getMeasureWidth(); int height=view.getMeasureHeight(); } });
.
3. ViewTreeObserver
当View树的状态发生改变或者View树内部的View的可见性发现改变时,onGlobalLayout方法将被回调,不过它会被回调多次。
所以第一次回调完便移除监听。
ViewTreeObserver observer= view.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); int with=view.getMeasureWidth(); int height=view.getMeasureHeight(); } });
.
4. view.measure(int widthMeasureSepc,int heightMeasureSpec)
通过手动对View进行measure来得到View的宽高。这个方法执行完,View的宽高是可以获取的。
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); view.getMeasuredWidth();
相关文章推荐
- 规则引擎技术研究
- aerospike参考资料
- TCP/IP(5)-IP选路,动态选路,和一些细节
- 2015百度校园招聘面试题
- C# 日期转换为中文大写
- ubuntu键盘映射
- c#开发windows 服务
- android 输入法弹出关闭与禁用
- 利用NDK 生成.so文件
- 老板说很重视你的新项目,你信么?
- Java Web开发环境配置
- OC_05_02
- IOS:在app中访问appstore中的app
- OC学习篇之---类的延展
- log在线生成器 html中如何设置浏览器中标题前的logo
- 【转】Eclipse Class Decompiler——Java反编译插件
- mac上传文件到linux服务器上
- [LeetCode]036-Valid Sudoku
- velocity的布局
- Swift之单例模式