onWindowFocusChanged(boolean hasFocus)
2016-01-04 10:37
302 查看
常常发现, 在oncreate()里面需要获取某些控件的状态,如宽高等.以实现 在 程序准备完毕后 立即触发某些条件. 结果却不尽人意, 获取的值往往都是 0或-1.
这表示 Activity 并没有准备好(渲染好). 那么怎样才能在其准备好立即 触发某些 条件呢?
有人说可以利用Activity的生命周期。onResume当你的Activity成为屏幕前端Activity后onResume将被立刻调用.
其实 , onResume 紧紧是 Activity 进入可见 , 但并不代表 控件是 "ok" 的.
写了个简单的demo,一个Activity只显示一个TestImageView,并重写TestImageView下的onMeasure()、onLayout()、onDraw()方法,并对其设置onGlobalLayout()监听,观察这几个方法与Activity的onResume()、onWindowFocusChanged()的调用顺序,如下:
ClipDrawableActivity onCreate()
time=1376920332125
ClipDrawableActivity
onResume()
TestImageView.width=0
time=1376920332149
MainActivity onWindowFocusChanged
hasFocus=false
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onLayout()
ClipDrawableActivity onGlobalLayout()
TestImageView.width=736
time=1376920332185
ClipDrawableActivity
onWindowFocusChanged()
hasFocus=true
TestImageView.width=736
time=1376920332187
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onLayout()
ClipDrawableActivity onGlobalLayout()
TestImageView.width=736
time=1376920332194
ClipDrawableActivity TestImageView onDraw()
其调用顺序为Activity.oncreate()→Activity.onResume()→
→TestImageView.onMeasure()→TestImageView.onLayout()→onGlobalLayoutListener()→
→Activity.onWidnowFocusChanged()→.....→
→TextImageView.onDraw()
至此,如果需要获取某个View的宽高,可以在onWindowFocusChanged()处直接获取即可,这比对某个view设置onGlobalLayoutListener的方式来获取方便了许此。又比如,对于需要读取本地文件记录来判断是否是第一次打开界面去提示文本图片的,也可以在此方法中去读取然后再显示在ui上。
listview的 getvisibilityposition在 oncreate里面是返回-1. 可以在这里解决.
这表示 Activity 并没有准备好(渲染好). 那么怎样才能在其准备好立即 触发某些 条件呢?
有人说可以利用Activity的生命周期。onResume当你的Activity成为屏幕前端Activity后onResume将被立刻调用.
其实 , onResume 紧紧是 Activity 进入可见 , 但并不代表 控件是 "ok" 的.
写了个简单的demo,一个Activity只显示一个TestImageView,并重写TestImageView下的onMeasure()、onLayout()、onDraw()方法,并对其设置onGlobalLayout()监听,观察这几个方法与Activity的onResume()、onWindowFocusChanged()的调用顺序,如下:
ClipDrawableActivity onCreate()
time=1376920332125
ClipDrawableActivity
onResume()
TestImageView.width=0
time=1376920332149
MainActivity onWindowFocusChanged
hasFocus=false
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onLayout()
ClipDrawableActivity onGlobalLayout()
TestImageView.width=736
time=1376920332185
ClipDrawableActivity
onWindowFocusChanged()
hasFocus=true
TestImageView.width=736
time=1376920332187
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onMeasure()
ClipDrawableActivity TestImageView onLayout()
ClipDrawableActivity onGlobalLayout()
TestImageView.width=736
time=1376920332194
ClipDrawableActivity TestImageView onDraw()
其调用顺序为Activity.oncreate()→Activity.onResume()→
→TestImageView.onMeasure()→TestImageView.onLayout()→onGlobalLayoutListener()→
→Activity.onWidnowFocusChanged()→.....→
→TextImageView.onDraw()
至此,如果需要获取某个View的宽高,可以在onWindowFocusChanged()处直接获取即可,这比对某个view设置onGlobalLayoutListener的方式来获取方便了许此。又比如,对于需要读取本地文件记录来判断是否是第一次打开界面去提示文本图片的,也可以在此方法中去读取然后再显示在ui上。
listview的 getvisibilityposition在 oncreate里面是返回-1. 可以在这里解决.
相关文章推荐
- Oracle中创建dblink的方法
- ListActivity 的使用
- UINavigationController使用
- ORA-00119 ORA-00132
- 模拟监控VS真实用户监控!应用性能监控工具大PK
- Python实现控制台进度条功能
- Python-OpenCV 处理图像(二):滤镜和图像运算
- iOS获取对象属性列表
- activity之间的传值与回传
- iOS导航栏透明
- myeclipse安装svn插件的多种方式
- 插入影像图失败
- 大数据学习之Scala中数据类型(3)
- 开放 合作 共享 拥抱物业管理新常态
- Android px,dp,pt,sp的区别
- [Drools] JAVA规则引擎
- iOS LaunchImage图片尺寸
- 菜鸟学习之路(一)
- Tomcat在Linux上安装
- spring 定时任务读取文本文件