android getview方法,android 获取view的getLeft(), getRight(), getTop(),... - 简书
問(wèn)題描述
當(dāng)我們?cè)趏nCreate()回調(diào)方法中去調(diào)用getLeft(), getRight(), getTop(), getBottom()、getLocationInWindow等值為0
問(wèn)題原因
View的顯示必須經(jīng)歷Measure(測(cè)量)、Layout(布局)和Draw(繪制)過(guò)程。而在Measure與Layout過(guò)程完成之后,View的width、height、top、left等屬性才被正確賦值,此時(shí)我們才能獲取到正確的值,這幾個(gè)過(guò)程都晚于onCreate執(zhí)行
解決方式
1、 view post 一個(gè)runnable。
因?yàn)閁I線程消息隊(duì)列會(huì)按順序處理事件,在setContentView()被調(diào)用后,消息隊(duì)列中會(huì)包含一個(gè)要求重新Layout的msg,所以任何你post到UI線程隊(duì)列中的東西都會(huì)在Layout后執(zhí)行。
view.post(new Runnable() {
@Override
public void run() {
view.getHeight();
}
});
2、重寫Activity的onWindowFocusChanged方法。
在Activity得到或者失去焦點(diǎn)的時(shí)候,就會(huì)被調(diào)用。Activity初始化完畢準(zhǔn)備顯示的時(shí)候就會(huì)回調(diào)該方法。所以說(shuō),只要想做一些Activity加載完畢就馬上觸發(fā)的事情,都可以在這里執(zhí)行。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
//此處可以正常獲取width、height等
}
3、為View注冊(cè)監(jiān)聽(tīng)器OnGlobalLayoutListener。
視圖樹(shù)的可視性或全局布局狀態(tài)發(fā)生變化時(shí)執(zhí)行的回調(diào)函數(shù),此時(shí)已經(jīng)完成Layout過(guò)程,可能會(huì)被多次調(diào)用,所以獲取完后就可以移除監(jiān)聽(tīng)器
mView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//此處可以正常獲取width、height等
mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
總結(jié)
以上是生活随笔為你收集整理的android getview方法,android 获取view的getLeft(), getRight(), getTop(),... - 简书的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android 监听时钟变化,Andro
- 下一篇: android 看AP 国家代码,And