43

を使用して正常にコンパイルされるコードがいくつかViewTreeObserver#removeOnGlobalLayoutListener(...)あり、実行すると、このメソッドはスローしNoSuchMethodErrorます。なんで?

4

3 に答える 3

150

ほぼ同じ名前のメソッドが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);
}
于 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 に答える