为什么removeOnGlobalLayoutListener会抛出NoSuchMethodError?

时间:2013-03-01 16:54:11

标签: android

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

3 个答案:

答案 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);
    }
}