常常发现, 在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. 可以在这里解决.