我有一些代码,使用ViewTreeObserver#removeOnGlobalLayoutListener(...)
编译成功,但运行时此方法会抛出NoSuchMethodError
。为什么?
我有一些代码,使用ViewTreeObserver#removeOnGlobalLayoutListener(...)
编译成功,但运行时此方法会抛出NoSuchMethodError
。为什么?
ViewTreeObserver中有两个方法名几乎相同。
removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)
(先on后global)是在API 16中添加的方法。它替换了
removeGlobalOnLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)
(先global后on),后者自API 1以来一直存在,但现在已被弃用。
这两种方法都可以在编译时出现(如果您正在构建Jellybean或更高版本),但新版本将无法在Jellybean之前的设备上运行。
以下代码可以避免错误:
try {
thing.removeOnGlobalLayoutListener(victim);
} catch (NoSuchMethodError x) {
thing.removeGlobalOnLayoutListener(victim);
}
所以这段代码:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
thing.removeGlobalOnLayoutListener(victim);
} else {
thing.removeOnGlobalLayoutListener(victim);
}
ViewTreeObserver#addOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener)
保持一致,而在 Android 1.5 中有人犯了一个错误,直到 Android 4 才有人注意到并修复了它.... - Andrew Wyld我猜你在谈论ViewTreeObserver类中的removeOnGlobalLayoutListener方法。该方法是在API 16级别中添加的。我最好的猜测是你试图在运行旧版本Android系统的设备上使用它,因此找不到该方法。
removeGlobalOnLayoutListener(...)
(已弃用,API 1)是值得的 :) - Andrew Wyldpublic static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
if (Build.VERSION.SDK_INT < 16) {
v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
}