为什么removeOnGlobalLayoutListener会抛出NoSuchMethodError?

And*_*yld 43 android

我有一些代码可以成功编译使用ViewTreeObserver#removeOnGlobalLayoutListener(...),当它运行时,此方法抛出NoSuchMethodError.为什么?

And*_*yld 148

两种方法ViewTreeObserver几乎相同的名称.

removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

(然后全球)是在API 16中添加它替代的方法

removeGlobalOnLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

(全球然后开启)自API 1以来就存在,但现在已被弃用.

这两种方法都可以出现在编译时(如果您正在构建Jellybean或更高版本),但较新的方法将在pre-Jellybean设备上失败.

此代码阻止了错误:

try {
    thing.removeOnGlobalLayoutListener(victim);
} catch (NoSuchMethodError x) {
    thing.removeGlobalOnLayoutListener(victim);
}
Run Code Online (Sandbox Code Playgroud)

这段代码也是如此:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
    thing.removeGlobalOnLayoutListener(victim);
} else {
    thing.removeOnGlobalLayoutListener(victim);
}
Run Code Online (Sandbox Code Playgroud)

  • 哇,这就像谷歌试图欺骗开发者.谢谢你的解决方案! (24认同)
  • 哈,我知道你的意思!我认为这是为了与`ViewTreeObserver #addOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener)`的一致性而且有人在Android 1.5中犯了一个错误,没有人费心去修复它直到Android 4 .... (3认同)