为什么removeOnGlobalLayoutListener会抛出一个NoSuchMethodError?

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

ViewTreeObserver两个方法名称几乎相同。

removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

全球范围内 )是一种在API 16中添加的方法。它取代了

removeGlobalOnLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

全球然后)从API 1,但现在已经废弃了。

这两种方法都可以在编译时出现(如果您正在构buildJellybean或更高版本),但是更新的方法会在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类中的removeOnGlobalLayoutListener。 这个方法被添加到API级别16.我最好的猜测是,你尝试在运行旧版Android的设备上使用它,这就是为什么它不能被发现。

我有工作代码

 public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){ if (Build.VERSION.SDK_INT < 16) { v.getViewTreeObserver().removeGlobalOnLayoutListener(listener); } else { v.getViewTreeObserver().removeOnGlobalLayoutListener(listener); } }