日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 开发 Activity里获取View的宽度和高度 转载

發布時間:2025/7/14 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 开发 Activity里获取View的宽度和高度 转载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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 的寬度和高度。代碼如下:

Activity的onWindowFocusChanged中獲取view的寬度和高度@Overridepublic void onWindowFocusChanged(boolean hasWindowFocus) {super.onWindowFocusChanged(hasWindowFocus);if(hasWindowFocus){int width = view.getMeasuredWidth();int height = view.getMeasuredHeight();}}

注意:雖然使用很方便,但在使用這個方法時需要特別注意:onWindowFocusChanged會執行多次,在Activity獲取焦點和失去焦點時都會被調用一次。即在onPause和onResume方法被執行時被反復調用。

View.post(new Runnable())方法中獲取:

通過View.post方法把Runnable對象放到消息隊列的末尾,當執行到這個runable方法的時候,View所有的初始化測量方法說明都已經執行完畢了。因此在這里獲取的時候就是測量后的真實值。代碼如下:

Activity通過mView.post方法獲取

mView.post(new Runnable() {@Overridepublic void run() {int width = mView.getMeasuredWidth();int height = mView.getMeasuredHeight();}});

通過ViewTreeObserver獲取:

當View樹的狀態發生改變或者View樹內部View的可見性發生改變的時候,onGlobalLayout將會被回調。注意:伴隨著View樹的狀態改變,onGlobalLayout會被調用多次。實現如下:

在Activity生命周期方法中通過ViewTreeObserver獲取

ViewTreeObserver observer = mView.getViewTreeObserver();observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);int width = mView.getMeasuredWidth();int height = mView.getMeasuredHeight();}});

手動調用View的measure方法后獲取:

手動調用measure后,View會調用onMeasure方法對View發起測量,測量完后,就可以獲取測量后的寬度和高度了。但是要對LayoutParams的參數分情況處理才能得到具體的參數值:
View的LayoutParams參數為match_parent:這種情況下無法獲取到具體寬高值,因為當View的測量模式為match_parent時,寬高值是取父容器的剩余空間大小作為它自己的寬高。而這時無法獲取到父容器的尺寸大小,因此獲取會失敗。
View的LayoutParams參數為具體值:

int width =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.EXACTLY);int height =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.EXACTLY);view.measure(width,height);int height=view.getMeasuredHeight();int width=view.getMeasuredWidth();


View的LayoutParams參數為wrap_content:

int width =View.MeasureSpec.makeMeasureSpec((1<<30)-1,View.MeasureSpec.AT_MOST);int height =View.MeasureSpec.makeMeasureSpec((1<<30)-1,View.MeasureSpec.AT_MOST);view.measure(width,height);int height=view.getMeasuredHeight();int width=view.getMeasuredWidth(); posted on 2019-03-09 10:35?觀心靜 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/guanxinjing/p/10499768.html

總結

以上是生活随笔為你收集整理的Android 开发 Activity里获取View的宽度和高度 转载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。