Android回调函数onSizeChanged()的替代方案有哪些?
Android onSizeChanged() 替代实现方案汇总
onSizeChanged() 是Android View体系中用于监听自身尺寸变化的回调,仅能在自定义View子类中重写使用,以下是不同场景下的可替代实现方案:
1. addOnLayoutChangeListener(推荐,单View监听场景)
API 11及以上系统提供的原生监听接口,无需自定义View即可在外部监听单个View的布局/尺寸变化,是最贴近onSizeChanged()能力的替代方案,支持直接获取新旧尺寸对比:
// Java 示例代码 targetView.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) { int newWidth = right - left; int newHeight = bottom - top; int oldWidth = oldRight - oldLeft; int oldHeight = oldBottom - oldTop; // 仅尺寸发生变化时执行逻辑,和onSizeChanged触发时机对齐 if (newWidth != oldWidth || newHeight != oldHeight) { // 你的业务逻辑 } } });
2. ViewTreeObserver 系列回调(全局视图监听场景)
适合需要监听整个视图树布局状态变化的场景,不需要自定义View:
OnGlobalLayoutListener:在视图树全局布局完成、任意View尺寸变化时触发,可在回调中获取目标View的最新宽高,使用完成后必须及时移除监听避免内存泄漏
示例:
// Kotlin 示例代码 targetView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { val width = targetView.width val height = targetView.height // 移除监听避免多次触发 targetView.viewTreeObserver.removeOnGlobalLayoutListener(this) // 你的业务逻辑 } })
OnPreDrawListener:触发时机早于OnGlobalLayoutListener,在视图绘制前回调,同样可以获取到最终测量完成的尺寸。
3. 自定义View重写onLayout()
如果本身处于自定义View的开发场景,也可以重写onLayout()方法自行判断尺寸变化,替代onSizeChanged()的逻辑:
@Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); int newWidth = right - left; int newHeight = bottom - top; if (newWidth != mLastWidth || newHeight != mLastHeight) { // 尺寸变化时的逻辑,和onSizeChanged效果一致 mLastWidth = newWidth; mLastHeight = newHeight; } }
注意需要在自定义View中定义成员变量存储上一次的宽高,避免每次布局都重复执行冗余逻辑。
内容的提问来源于stack exchange,提问作者yashrajgupta
相关产品推荐
相关产品推荐

