自定义Toast 在魅族4.2.1机器上发现适配问题。
自定义Toast 用到了setGravity(int gravity, int xOffset, int yOffset) 方法, 按照API 描述的说法 yOffset 的范围是全局屏幕,若Gravity 设置Gravity.TOP | Gravity.LEFT的话, xOffset, yOffset 就应该相对于屏幕的左上角了。
实际应用场景是想Toast show的位置刚好在界面title的下方,yOffset 传递的是title栏的高度。在三星4.0.3, 小米4.1.2, 魅族4.1.1 都没有问题,在魅族4.2.1 发现显示叠在了title栏上,后来发现它计算的时候把系统状态栏的高度也带进去了,我觉得这种做法是符合api文档描述的。但实际情况是其他几台机器都没有带上状态栏高度,于是只好针对这种情况做了特殊处理。
后来阅读了下Toast 源码,发现还是通过WindowManager addView 实现的。下面是SDK 4.2.2的源码:
public void handleShow() {
if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView
+ " mNextView=" + mNextView);
if (mView !&#