43

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

4

3 回答 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 回答