錯誤1:html
java.lang.NullPointerExceptionjava
at android.widget.PopupWindow$1.onScrollChanged(PopupWindow.java:127)android
at android.view.ViewTreeObserver.dispatchOnScrollChanged(ViewTreeObserver.java:607)git
at android.view.ViewRoot.draw(ViewRoot.java:1453)github
at android.view.ViewRoot.performTraversals(ViewRoot.java:1335)app
at android.view.ViewRoot.handleMessage(ViewRoot.java:1991)ide
at android.os.Handler.dispatchMessage(Handler.java:99)oop
at android.os.Looper.loop(Looper.java:150)ui
at android.app.ActivityThread.main(ActivityThread.java:4385)google
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
at dalvik.system.NativeStart.main(Native Method)
這個錯誤常常出如今 Gingerbread或更早的版本,3.0如下。是系統的bug
解決方案:
new PopupWindow以後加上以下的方法進行檢查便可,爲了兼容3.0如下版本,這個操做仍是必要的
private void fixPopupWindow(final PopupWindow window) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
try {
final Field fAnchor = PopupWindow.class
.getDeclaredField("mAnchor");
fAnchor.setAccessible(true);
Field listener = PopupWindow.class
.getDeclaredField("mOnScrollChangedListener");
listener.setAccessible(true);
final ViewTreeObserver.OnScrollChangedListener originalListener = (ViewTreeObserver.OnScrollChangedListener) listener
.get(window);
ViewTreeObserver.OnScrollChangedListener newListener = new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
try {
WeakReference<View> mAnchor = (WeakReference<View>) fAnchor.get(window);
if (mAnchor == null || mAnchor.get() == null) {
return;
} else {
originalListener.onScrollChanged();
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
};
listener.set(window, newListener);
} catch (Exception e) {
e.printStackTrace();
}
}
}
參考:
https://github.com/JakeWharton/ActionBarSherlock/issues/752
https://groups.google.com/forum/?fromgroups=#!msg/osmeditor4android/RsHYoY6XqlU/-WGSKWm5OMAJ
錯誤2:
java.lang.NullPointerException
at android.widget.PopupWindow$PopupViewContainer.dispatchKeyEvent(PopupWindow.java:1426)
at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2627)
at android.view.ViewRoot.deliverKeyEvent(ViewRoot.java:2592)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1881)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
解決方法:建立PopupWindow 的時候不調用 setFocusable(true),在showAtLocation後在調用setFocusable(true);而且在 dismiss的時候 調用setFocusable(false)
參考:
http://stackoverflow.com/questions/7768728/popupwindow-crash-on-dispatch-event