Android SDK在Android.widget.PopupWindow$1.onScrollChanged(PopupWindow.java:132)崩溃

Android SDK在Android.widget.PopupWindow$1.onScrollChanged(PopupWindow.java:132)崩溃,android,Android,谷歌开发团队的人能解释一下如何避免在ics之前的设备上发生这种崩溃吗?在我的例子中,ListView项上的ImageButton是创建下拉列表的PopupWindow的锚点。我已经尝试了所有弹出式.disease()、popup=null等,但是似乎没有任何东西能阻止适配器重置时出现问题 我得到以下例外情况: FATAL EXCEPTION: main java.lang.NullPointerException at android.widget.PopupWindow$1.onScro

谷歌开发团队的人能解释一下如何避免在ics之前的设备上发生这种崩溃吗?在我的例子中,ListView项上的ImageButton是创建下拉列表的PopupWindow的锚点。我已经尝试了所有弹出式.disease()、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中删除最后一个列表项后,我会重置适配器以设置页脚。然后,当我离开屏幕时,就会发生此错误

不在冰淇淋三明治里:冰淇淋三明治。看

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


我不确定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();  
    }
  }

if(Build.VERSION.SDK_intu)您将此代码放在您使用的位置,并且可以访问PopupWindow对象(您创建/首先访问它的位置,可能是您的活动类)我在我的应用程序中没有访问任何PopupWindow,但我使用的是ActionBarSherlock。我了解到我需要从ICS反向移植PopupWindow类来修复此问题,我这样做了,但StateListDrawable类方法不可用,并且在反向移植后,此类出现了更多我不知道如何修复的错误。抱歉,您必须查看b查看它在这里被触发的位置。然后你可以在它弹出之前交换侦听器。这里()你有关于这个bug的更多信息