を使用して正常にコンパイルされるコードがいくつかViewTreeObserver#removeOnGlobalLayoutListener(...)
あり、実行すると、このメソッドはスローしNoSuchMethodError
ます。なんで?
3 に答える
ほぼ同じ名前のメソッドが2 つあります。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);
}
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);
}
}