我有一些使用ViewTreeObserver#removeOnGlobalLayoutListener(...)
成功编译的代码,当它运行时,此方法抛出NoSuchMethodError
。为什么呢?
答案 0 :(得分:148)
ViewTreeObserver
中有两个方法,名称几乎相同。
removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)
( on 然后全局)是API 16中添加的方法。它取代了
removeGlobalOnLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)
(全局,然后 ),自API 1以来已存在,但现已弃用。
这两种方法都可以在编译时出现(如果你是针对Jellybean或更高版本构建的),但是较新的方法会在pre-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);
}
答案 1 :(得分:4)
我假设您正在讨论ViewTreeObserver类中的removeOnGlobalLayoutListener。此方法是在API级别16中添加的。我最好的猜测是,您尝试在运行旧版Android的设备上使用它,这就是无法找到它的原因。
答案 2 :(得分:3)
我有工作代码
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
if (Build.VERSION.SDK_INT < 16) {
v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
}