我有一些代码可以使用成功编译ViewTreeObserver#removeOnGlobalLayoutListener(...)
,当它运行时,这个方法会抛出NoSuchMethodError
. 为什么?
问问题
18260 次
3 回答
150
里面有两种方法ViewTreeObserver
几乎同名。
removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)
( on then global ) 是在 API 16 中添加的一种方法。它取代了
removeGlobalOnLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)
( global then 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);
}
于 2013-03-01T16:59:52.013 回答
4
我假设您正在谈论 ViewTreeObserver 类中的 removeOnGlobalLayoutListener 。此方法是在 API 级别 16 中添加的。我最好的猜测是您尝试在运行旧版本 Android 的设备上使用它,这就是找不到它的原因。
于 2013-03-01T16:58:05.897 回答
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);
}
}
于 2015-02-28T19:01:23.420 回答