2013-03-01 34 views
39

Tôi có một số mã biên dịch thành công bằng cách sử dụng ViewTreeObserver#removeOnGlobalLayoutListener(...) và khi chạy, phương thức này sẽ ném NoSuchMethodError. Tại sao?Tại sao removeOnGlobalLayoutListener ném một NoSuchMethodError?

+1

làm việc ở đâu là mã? – Rawkode

+1

Tôi biết giải pháp, tôi chỉ đăng bài theo định dạng câu hỏi và trả lời phổ biến và sôi nổi :) –

+0

Tôi giả sử bạn chỉ đang cố gắng để có được một vài cuộc bầu cử, nhưng bạn có thể tự đổi lấy ít nhất là cho @azertiti quyền Trả lời :) – Rigotti

Trả lời

142

hai phương pháp trong ViewTreeObserver có cùng tên.

removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

(trên sau đó toàn cầu) là một phương pháp mà đã được bổ sung trong API 16. Nó thay thế

removeGlobalOnLayoutListener(ViewTreeObserver.OnGlobalLayoutListener victim)

(toàn cầu sau đó trên) trong đó có tồn tại kể từ API 1, nhưng hiện không còn được dùng nữa.

Cả hai phương pháp đều có thể xuất hiện tại thời điểm biên dịch (nếu bạn đang xây dựng dựa trên Jellybean hoặc cao hơn) nhưng phương pháp mới hơn sẽ bị lỗi trên các thiết bị trước Jellybean.

Mã này cản trở các lỗi:

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

Vì vậy, hiện mã này:

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

Cảm ơn bạn để chia sẻ vấn đề và giải pháp của bạn. Tôi đã thử mã của bạn và vẫn gặp sự cố. Bạn có nhìn vào câu hỏi của tôi tại http://stackoverflow.com/questions/18285540/stop-listening-for-more-listener-events không? – Geek

+22

Ồ, giống như Google đang cố gắng troll các nhà phát triển. Cảm ơn vì giải pháp này! –

+3

Ha, tôi biết ý bạn là gì! Tôi nghĩ đó là sự nhất quán với 'ViewTreeObserver # addOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener) 'và ai đó đã phạm sai lầm trong Android 1.5, và không ai làm phiền để sửa nó cho đến Android 4 .... –

4

Tôi giả sử bạn đang nói về removeOnGlobalLayoutListener từ lớp ViewTreeObserver. Phương pháp này đã được thêm vào ở cấp API 16. Suy đoán tốt nhất của tôi là bạn cố gắng sử dụng phương pháp này trên một thiết bị chạy phiên bản Android cũ, đó là lý do tại sao nó không thể được tìm thấy.

+0

Tôi biết, tôi vừa phát hiện ra điều đó và nghĩ rằng sẽ đáng nói với mọi người về 'removeGlobalOnLayoutListener (...)' (không được chấp nhận, API 1) :) –

2

Tôi có mã

public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){ 
    if (Build.VERSION.SDK_INT < 16) { 
     v.getViewTreeObserver().removeGlobalOnLayoutListener(listener); 
    } else { 
     v.getViewTreeObserver().removeOnGlobalLayoutListener(listener); 
    } 
} 
Các vấn đề liên quan