?有時候隘弊,我們需要在activity啟動的時候獲取view的寬高,但很多時候在onStart()或onRsume()中獲取的都是0,這是view的measure過程與activity的生命周期不是同步的关霸,所以當(dāng)沒有測量完成,返回的都是0杰扫。那要怎么獲取呢?
?1. onWindowFocusChanges
?調(diào)用這個方法時那說明view已經(jīng)初始化完畢队寇,寬高已經(jīng)賦值啦。但是這方法會被調(diào)用多次章姓,如獲取焦點與失去佳遣,activity暫停與恢復(fù)等都會被調(diào)用。
public void onWindowFocusChanged(boolean focus){
? ? ? ? super.onWindowFocusChanged(focus);
? ? ? ? if(focus){
? ? ? ? ? ? ?int width = view.getMeasuredWidth();
? ? ? ? ? ? int ?height = view.getMeasuredHeight();
? ? ?}
}
2. view.post(runnable)
通過post一個runnable到信息列隊尾部凡伊,當(dāng)調(diào)用此方法時view已經(jīng)初始化好了零渐。
protected void ?onStart() {
? ? ?super.onStart();
? ? view.post(newRunnable() {
? ? ? ? ?public void run() {
? ? ? ? ? ? ? int width =view.getMeasuredWidth();
? ? ? ? ? ? ? int height =view.getMeasuredHeight();
? ? ? ? ?}
? ? });
}
3.ViewTreeObserver
使用ViewTreeObserver的OnGlobalLayotListener接口可以獲取寬高,但是OnGlobalLayoutListener接口中的onGlobalLayout會被調(diào)用多次系忙。
ViewTreeObserver observer= view.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
? ? ? @RequiresApi(api= Build.VERSION_CODES.JELLY_BEAN)
? ? ? @Override
? ? ? public voidonGlobalLayout() {
? ? ? ? ? ? ? view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
? ? ? ? ? ? ? int ?width =view.getMeasuredWidth();
? ? ? ? ? ? ?int ? height =view.getMeasuredHeight();
? ? ?}
});