2013-03-01 12 views
39

Ich habe einige Code, der erfolgreich kompiliert mit ViewTreeObserver#removeOnGlobalLayoutListener(...) und wenn es ausgeführt wird, löst diese Methode NoSuchMethodError. Warum?Warum wirft removeOnGlobalLayoutListener einen NoSuchMethodError?

+1

Wo ist? – Rawkode

+1

Ich kenne die Lösung, ich habe gerade in der populären und lebendigen Frage-und-Antwort-Format :) –

+0

Ich nehme an, Sie waren nur versuchen, ein paar upvotes zu bekommen, aber Sie können sich selbst zumindest @azertiti das Recht zurückgeben Antwort :) – Rigotti

Antwort

142

Es gibt zwei Methoden in ViewTreeObserver mit fast den gleichen Namen.

removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

(auf dann global) ein Verfahren ist, das in API hinzugefügt wurde 16. Es ersetzt

removeGlobalOnLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

(globale dann auf), das existiert seit API 1, ist aber jetzt veraltet.

Beide Methoden können zur Kompilierungszeit angezeigt werden (wenn Sie gegen Jellybean oder höher bauen), aber die neuere Version wird auf Jellybean-Geräten fehlschlagen.

Dieser Code trotzt der Fehler:

try { 
    thing.removeOnGlobalLayoutListener(victim); 
} catch (NoSuchMethodError x) { 
    thing.removeGlobalOnLayoutListener(victim); 
} 

So funktioniert dieser Code:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { 
    thing.removeGlobalOnLayoutListener(victim); 
} else { 
    thing.removeOnGlobalLayoutListener(victim); 
} 
+0

Danke Sie für das Teilen Ihres Problems und Ihrer Lösung. Ich habe Ihren Code ausprobiert und sehe mich immer noch mit dem Problem konfrontiert. Würden Sie sich meine Frage unter http://stackoverflow.com/questions/18285540/stop-listening-for-more-listener-events ansehen? – Geek

+22

Wow, es ist, als würde Google versuchen, Entwickler zu trollen. Danke für diese Lösung! –

+3

Ha, ich weiß was du meinst! Ich denke, es ist für die Konsistenz mit "ViewTreeObserver # addOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener)" und jemand machte einen Fehler in Android 1.5, und niemand kümmerte sich darum, es zu beheben, bis Android 4 .... –

4

Ich nehme an, Sie sprechen über removeOnGlobalLayoutListener von ViewTreeObserver-Klasse. Diese Methode wurde in API-Ebene 16 hinzugefügt. Meine beste Vermutung ist, dass Sie versuchen, es auf einem Gerät zu verwenden, auf dem eine alte Version von Android ausgeführt wird, weshalb es nicht gefunden werden kann.

+0

Ich weiß, ich fand das gerade heraus und dachte, es wäre wert, jedem etwas über 'removeGlobalOnLayoutListener (...) '(veraltet, API 1) zu erzählen :) –

2

I-Code arbeiten, haben Sie den Code

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