自定义View 中很关键的问题View获取宽/高是0 的解决办法
原因
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相關書籍,結合自己代碼 實踐所得.謝謝.
總結
以上是生活随笔為你收集整理的自定义View 中很关键的问题View获取宽/高是0 的解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 消息机制 Handler
- 下一篇: Android 中的线程及 AsyncT