【Android開發坑系列】之PopupWindow


  1. PopupWindow在4.0之前的版本有個系統級別的BUG,必須借助一段自定義的fix代碼來修復。其中mPopPm就是PopupWindow實例。
    java.lang.NullPointerException
    at android.widget.PopupWindow$1.onScrollChanged

    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(mPopPm);
                    ViewTreeObserver.OnScrollChangedListener newListener =
                            new ViewTreeObserver.OnScrollChangedListener() {
                                public void onScrollChanged() {
                                    try {
                                        View mAnchor = (View) fAnchor.get(mPopPm);
                                        if (mAnchor == null) {
                                            return;
                                        } else {
                                            originalListener.onScrollChanged();
                                        }
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            };
                    listener.set(mPopPm, newListener);
                } catch (Exception e) {
                    e.printStackTrace();
                }
  2. 在生成popupWindow的父Activity銷毀之前,需要銷毀popupWindow。否則會報內存泄露(leak)。也即在Activity的onDestroy()執行如下代碼:
            if (mPopupWindow != null) {
                mPopupWindow.dismiss();
                mPopupWindow = null;
            }
  3. 在<=2.3的系統上,慎用setFocusable(boolean),一般設為mPopPm.setFocusable(false)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM