为什么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); } }