Android 开发 Activity里获取View的宽度和高度 转载
原文地址:https://blog.csdn.net/chenbaige/article/details/77991594
前言:
可能很多情況下,我們都會有在activity中獲取view 的尺寸大小(寬度和高度)的需求。面對這種情況,很多同學立馬反應:這么簡單的問題,還用你說?你是不是傻。。然后立馬寫下getWidth()、getHeight()等方法,洋洋得意的就走了。然而事實就是這樣的嗎?實踐證明,我們這樣是獲取不到View的寬度和高度大小的,可能很多同學又會納悶了,這是為什么呢?一直不都是這樣獲取大小的嘛!
疑問解答:
實際情況下,View的measure過程和Activity的生命周期方法不是同步執行的,因此無法保證Activity在執行完某個生命周期方法時View已經測量完畢了,這種情況下,獲取到的尺寸大小就是0。因此,在很多情況下,我們正在為我們機智而得意時,事實卻讓我們大跌眼鏡,甚是尷尬。
解決方案:
接下來我們介紹四種方式去正確的獲取View的尺寸大小。
onWindowFocusChanged方法中獲取:
onWindowFocusChanged方法執行時代表View已經初始化完畢了,寬度和高度已經測量完畢并且最終確認好了,這時我們可以放心的在這里去獲取View 的寬度和高度。代碼如下:
注意:雖然使用很方便,但在使用這個方法時需要特別注意:onWindowFocusChanged會執行多次,在Activity獲取焦點和失去焦點時都會被調用一次。即在onPause和onResume方法被執行時被反復調用。
View.post(new Runnable())方法中獲取:
通過View.post方法把Runnable對象放到消息隊列的末尾,當執行到這個runable方法的時候,View所有的初始化測量方法說明都已經執行完畢了。因此在這里獲取的時候就是測量后的真實值。代碼如下:
Activity通過mView.post方法獲取
通過ViewTreeObserver獲取:
當View樹的狀態發生改變或者View樹內部View的可見性發生改變的時候,onGlobalLayout將會被回調。注意:伴隨著View樹的狀態改變,onGlobalLayout會被調用多次。實現如下:
在Activity生命周期方法中通過ViewTreeObserver獲取
手動調用View的measure方法后獲取:
手動調用measure后,View會調用onMeasure方法對View發起測量,測量完后,就可以獲取測量后的寬度和高度了。但是要對LayoutParams的參數分情況處理才能得到具體的參數值:
View的LayoutParams參數為match_parent:這種情況下無法獲取到具體寬高值,因為當View的測量模式為match_parent時,寬高值是取父容器的剩余空間大小作為它自己的寬高。而這時無法獲取到父容器的尺寸大小,因此獲取會失敗。
View的LayoutParams參數為具體值:
View的LayoutParams參數為wrap_content:
轉載于:https://www.cnblogs.com/guanxinjing/p/10499768.html
總結
以上是生活随笔為你收集整理的Android 开发 Activity里获取View的宽度和高度 转载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10 + GTX1080配置Ten
- 下一篇: Python入门习题9.数码管时间