4

谷歌开发团队的人可以解释如何避免在 pre-ics 设备上发生这种崩溃吗?在我的例子中,ListView 项目上的 ImageButton 是 PopupWindow 的锚点,用于创建下拉菜单。我已经尝试了所有 popup.dismiss() 、 popup= null 等,但似乎没有什么可以阻止在适配器重置时出现此问题。

我收到以下异常:

 FATAL EXCEPTION: main
 java.lang.NullPointerException
 at android.widget.PopupWindow$1.onScrollChanged(PopupWindow.java:132)
 05-21 17:02:27.736: E/AndroidRuntime(25836): at   
 android.view.ViewTreeObserver.dispatchOnScrollChanged(ViewTreeObserver.java:607)

此弹出窗口位于列表项上。从 ListView 中删除最后一个列表项后,我将 resetAdapter 设置页脚。然后,当我离开屏幕时,会发生此错误。

不在冰淇淋三明治中:冰淇淋三明治。见https://android.googlesource.com/platform/frameworks/base/+/749b0eb2c9a52bb188fd8900859b3725889e0ec0%5E!/

这表明了与 PopupWindow 的空锚点相关的修复。可以做什么?在我的例子中,ListView 项目中的一个按钮是弹出窗口的锚点。同样的问题在这里:

https://github.com/JakeWharton/ActionBarSherlock/issues/487

4

1 回答 1

1

不知道 OP 是否还需要这个,因为半年后我才看到这个..

这在 ICS 中已修复。但是,您可以通过反射分配一个固定的滚动监听器!

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() {
                    public void onScrollChanged() {
                        try {
                            // PopupWindow implementation has WeakReference<View>
                            WeakReference<View> mAnchor = (WeakReference<View>) fAnchor.get(window);
                            if (mAnchor == null || mAnchor.get() == null) {
                                return;
                            } else {
                               originalListener.onScrollChanged();
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };
      listener.set(window,newListener);
    } catch (Exception e) {
      e.printStackTrace();  
    }
  }
于 2013-03-04T04:57:27.827 回答