4

Google 開発チームの誰かが、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)

このポップアップはリスト項目にあります。最後のリスト項目が L​​istView から削除されたら、resetAdapter をフッターに設定します。次に、画面から離れると、このエラーが発生します。

アイス クリーム サンドイッチにはない: アイス クリーム サンドイッチ。https://android.googlesource.com/platform/frameworks/base/+/749b0eb2c9a52bb188fd8900859b3725889e0ec0%5E!/を参照してください。

これは、PopupWindow の null アンカーに関連する修正を示唆しています。何ができるでしょうか?私の場合、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 に答える