自定义View 中很关键的问题View获取宽/高是0 的解决办法
2016-09-26 14:54
471 查看
原因
Activity的生命周期方法 与 View在measure过程 不是同步执行的,也就是说Activity在执行onCreate ,onStart , onResume 过程中 ,View的测量是否完成 ,得不到保证.所以 如果View没有测量完的话,View 获取的宽/高必然是0.解决办法:
1 ViewTreeObserver
使用这个OnGlobaLayoutListener这个接口 , 视图树状态发生改变或者视图树内部的View de 可见性发升改变时, 这个接口被回调,此时 可以获得View的 宽和高.2 view.post(runnable)
通过post 可以将一个runnable 投递到消息队列的尾部,然后等待Loop二调用到此runnable的时候, View早已经初始化完毕了.3 onWindowFocusChanged
这个方法 , View 已经初始化完毕了.当然可以获取宽和高了.Activity 得到和失去焦点的时候这个onWindowFocusChanged ())方法均会调用一次.此时就可以获得啦.4 view.measure(int widthMeasureSpec, int heightMeasureSpec)
手动方法对View 进行 测量来获得View的宽和高.方法 有两种
一,指定了具体的数值
宽/高是200px
二, 在wrap_content
解释说明:MeasureSpec代表一个32位int 值, 前2位代表SpecMode(测量模式)), 后30位代表SpecSize(某种测量模式下的大小)).
所以 代码中使用了(1<<30)-1; View理论上支持的最大值.
三,在 match_parent 这中模式中 无法测量. 原因 根据源码分析 必须要知道parentSize(父类容器的剩余大小,此时我们不知道大小是多少.)
备注:根据工作经验 上面四种方法中 使用场景不同,本人常使用 第一种 和 第四种. 其他两种是通过 阅读Android相关书籍,结合自己代码 实践所得.谢谢.
相关文章推荐
- IOS 下获取 rootviewcontroller 的版本不同的问题解决办法
- 新建类在ClassView中不能显示问题解决办法
- 关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
- 关于AutoCompleteTextView 为什么必须输入两个字符才能出现补全提示的问题的解决办法
- jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
- Tabhost中子Activity使用startActivityForResult后获取不到回调值问题的解决办法
- 关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
- js获取cookie乱码问题的解决办法……
- 关于AutoCompleteTextView 为什么必须输入两个字符才能出现补全提示的问题的解决办法
- UIScrollView中的UITextField键盘遮挡问题的最简单解决办法
- IE8上传文件时获取文件本地路径问题(C:\fakepath\……)的解决办法
- 移动开发:Tabhost中子Activity使用startActivityForResult后获取不到回调值问题的解决办法
- VC中CRectTracker在CScrollView中的问题解决办法
- 获取文件上传页面中文数据时乱码问题的解决办法
- c#远程获取网页内容及乱码问题的解决办法
- V单视图拆分含有FormView的视类中出现的问题及解决办法
- IE8上传文件时获取文件本地路径问题(C:\fakepath\……)的解决办法
- VC中CRectTracker在CScrollView中的问题解决办法
- 关于AutoCompleteTextView 为什么必须输入两个字符才能出现补全提示的问题的解决办法
- android 获取网络数据,回传到本地用TextView显示乱码问题解决方法