获取android activity view,Android的Activity获取View宽高的常用方式

假如我们在Activity已经启动完之后,需要获取一个View的宽/高。可能大部分人都试过在onCreate、onStart、onResume中获取宽/高,然而获取的结果均为 0。这是因为View的measure过程和Activity的生命周期并不是同步执行的,因此无法保证在onCreate、onStart、onResume中获取宽/高时View已经测量完了,如果没有测量完,获得的宽/高就是0。

我们用以下几个方法解决这个问题:

一、Activity/View#onWindowFocusChanged

onWindowFocusChanged的含义:View已经初始化完毕了,宽/高已经准备好了,这个时候获取宽/高是没有问题的。当Activity的当前Window获得或失去焦点时会回调此方法,也就是说当Activity暂停执行和继续执行都会回调此方法,即这个方法会被频繁调用。我们一般在第一次获取焦点时获取宽高,代码如下:

private boolean isFirstFocus = true;

@Override

public void onWindowFocusChanged(boolean hasFocus) {

super.onWindowFocusChanged(hasFocus);

if (hasFocus&&isFirstFocus){

isFirstFocus = false;

int width = view.getMeasuredWidth();

int height = view.getMeasuredHeight();

}

}

二、view.post(runnable)

利用 Handler 通信机制,通过post将添加一个 Runnable到message queue的队尾,当View初始化完成之后,Looper会调用此runnable,然后通知UI线程。代码如下:

@Override

protected void onStart() {

super.onStart();

view.post(new Runnable() {

@Override

public void run() {

int width = view.getMeasuredWidth();

int height = view.getMeasuredHeight();

}

});

}

三、ViewTreeObserver

当View树状态发生改变,或者View树内部的view的可见性发生改变时,onGlobalLayout会被回调,所以这也是获取宽高的一个很好的时机。伴随着View树的状态的改变,onGlobalLayout会被调用多次,因此可在第一次调用完后,移除监听事件。代码如下:

@Override

protected void onStart() {

Logger.e("onStart");

super.onStart();

ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();

viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

view.removeOnLayoutChangeListener(this);

int width = view.getMeasuredWidth();

int height = view.getMeasuredHeight();

}

});

}

四、View#addOnLayoutChangeListener

监听 View的onLayout()的绘制过程,一旦宽/高发生变化就会回调onLayoutChange方法。因此可在第一次调用完后,移除监听事件。代码如下:

view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {

@Override

public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {

view.removeOnLayoutChangeListener(this);

Logger.e("w/h:" + view.getWidth() + "-" + view.getHeight());

}

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值