zoukankan      html  css  js  c++  java
  • 【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)
  • 相关阅读:
    HDU4825/5536 [01 字典树/简单字典树更新]
    HDU 2017 多校联合Contest 3
    51nod 多重背包 [二进制优化]
    UVa 123042D Geometry 110 in 1! [平面几何]
    UVA 11796Dog Distance[平面几何]
    洛谷P1004 方格取数[多维dp]
    HDU 1576 A/B [逆元]
    POJ1006 中国剩余定理
    HDU 1573~3579 X问题&Hello Kiki[同余方程]
    一元线性同余方程组
  • 原文地址:https://www.cnblogs.com/kaima/p/3160897.html
Copyright © 2011-2022 走看看