2013-03-01 6 views
39

私はViewTreeObserver#removeOnGlobalLayoutListener(...)を使用して正常にコンパイルするコードを持っています。実行すると、このメソッドはNoSuchMethodErrorをスローします。どうして?removeOnGlobalLayoutListenerがNoSuchMethodErrorをスローするのはなぜですか?

+1

コードだが働いていますか? – Rawkode

+1

私は解決策を知っていますが、私は普及した活発な質疑応答の形式で投稿していました:) –

+0

私はあなたがいくつかのアップフォートを取得しようとしていると仮定していますが、少なくとも@azertitiに答え: – Rigotti

答えて

142

の2つのメソッドがほぼ同じ名前のViewTreeObserverにあります。

removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

(その後にグローバル)がAPIに加えた方法である16.それは有する

removeGlobalOnLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

グローバルに次に)を置き換えます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); 
} 
+0

ありがとうあなたの問題と解決策を共有するためのあなた。私はあなたのコードを試して、まだ問題に直面しています。あなたは私の質問をhttp://stackoverflow.com/questions/18285540/stop-listening-for-more-listener-eventsで見ていただけますか? – Geek

+22

うわー、それはGoogleが開発者をトロールしようとしているようなものです。このソリューションをありがとう! –

+3

ハ、私はあなたが何を意味知っている!私はそれが 'ViewTreeObserver#addOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener)'と一貫していると思います。誰かがAndroid 1.5で間違いを犯しました。 –

4

あなたはViewTreeObserverクラスのremoveOnGlobalLayoutListenerについて話しているとします。このメソッドはAPIレベル16で追加されました。Androidの旧バージョンを実行しているデバイスでこのAPIを使用しようとすると、それが見つからないというのが私の推測です。

+0

私はそれを知り、 'removeGlobalOnLayoutListener(...)'(非推奨、API 1)について皆に伝える価値があると思っています:) –

2

私はコード

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