【Android开发坑系列】之PopupWindow
- PopupWindow在4.0之前的版本有个系统级别的BUG,必须借助一段自定义的fix代码来修复。其中mPopPm就是PopupWindow实例。
java.lang.NullPointerException
at android.widget.PopupWindow$1.onScrollChangedif (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();
} - 在生成popupWindow的父Activity销毁之前,需要销毁popupWindow。否则会报内存泄露(leak)。也即在Activity的onDestroy()执行如下代码:
if (mPopupWindow != null) {
mPopupWindow.dismiss();
mPopupWindow = null;
} - 在<=2.3的系统上,慎用setFocusable(boolean),一般设为mPopPm.setFocusable(false)
【Android开发坑系列】之PopupWindow的更多相关文章
- 【Android开发坑系列】之事件分发机制
总结一下: 事件序列的定义:从手触摸屏幕(含)到离开屏幕(含)期间所发生的一系列交互事件.主要由ACTION_DOWN.ACTION_MOVE.ACTOIN_UP.ACTION_CANCEL等组成,其 ...
- 【Android开发坑系列】如何让Service尽可能存活
流行的思路如下[2015-11-20更新]: 1.让Service杀不死.Service的onStartCommand返回START_STICKY,同时onDestroy里面调用startServic ...
- 【Android开发坑系列】之Fragment
这个东西有顾名思义是碎片,和之前的Activity对应. 坑1:一般情况都会想当然的以为进程被杀掉之后,Fragment也会被回收 其实,Fragment有自己的生命周期,有自己的管理器(Fragme ...
- 【Android开发坑系列】之事件
总结一下: 1.Touch事件分发中只有两个主角:ViewGroup和View.ViewGroup包含onInterceptTouchEvent.dispatchTouchEvent.onTouchE ...
- 【Android开发坑系列】之经常被忽略的背景图片内存泄露
我们平时设置图片的时候,几乎都忘记回收老的(背景)图片,比如: TextView.setBackgroundDrawable() TextView.setBackgroundResource() Im ...
- 【Android开发坑系列】之try-catch
try { mViewPager.postDelayed(new Runnable() { @Override public void run() { getCurrentPage().render( ...
- 【Android开发坑系列】之窗口管理
关键知识要点如下(持续更新): WindowManagerService只负责管理Window,不负责图像的绘制: SurfaceFlinger负责图像的合成:
- Android 开发 框架系列 OkHttp拦截器
前言 此篇博客只讲解okhttp的拦截器功能的详细使用,如果你还不太了解okhttp可以参考我另外一篇博客 Android 开发 框架系列 OkHttp使用详解 添加Interceptor的简单例子 ...
- 推荐扔物线的HenCoder Android 开发进阶系列 后期接着更新
官网地址:http://hencoder.com/ 我来做一次辛勤的搬运工 HenCoder:给高级 Android 工程师的进阶手册 HenCoder Android 开发进阶: 自定义 View ...
随机推荐
- 工作中遇到的小问题: 做弹幕从数据库取出东西均匀插入marquee中,
function getFloatContent() { var method = 'GETFLOATCONTENT'; $.ajax({ url: 'api/zhenqiapi.php', data ...
- .net委托(转载)
一.什么是委托? 委托就是定义一个 对于方法的引用,类似于c++中的函数指针.委托是用来将方法作为参数 传递进入其它方法的, 委托的格式? 修饰符1 delegate 修饰符2 委托类型名(变量n ...
- treeMap and treeSet
TreeSet:如果要对对象进行排序,对象类要实现Comparable接口! TreeMap:如果要对对象进行排序,对象类要实现Comparable接口! 下面是我自己写的小程序主要传输对象 publ ...
- Remove Linked List Elements
Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...
- javascript基础知识-语句
关于javascript语句,有下面一些有趣的用法. 1.空语句的使用: 空语句只包含一个";",那在什么时候可以使用呢? 例: //初始化一个数组a for(i = 0;i &l ...
- sqlplus实现上下翻页设置
环境: 操作系统:red hat 5.8 OS 数据库:oracle 11g 11.2.0.1 安装软件:IO-Tty-1.07.tar. Term-ReadLine-Gnu-1.16.tar.uni ...
- Ubuntu: 为firefox安装flash插件
下载对应的tar.gz包后,将里边的libflashplayer.so粘贴到/usr/lib/mozilla/plugins中后重启firefox即可.
- PyPy 2.1 正式版发布
PyPy 2.1 Beta1 才刚刚在2天前发布,今天 PyPy 宣布 2.1 正式版发布. 值得关注的改进内容有: JIT support for ARM, architecture version ...
- pmcyg 1.0 发布,Cygwin 安装包创建工具
pmcyg 1.0 改进包列表中对 UTF-8 的支持. pmcyg是一种工具来创建自定义集合的Cygwin包 连同Cygwin安装程序.这使得创建独立的分布而无需镜整个组Cygwin包.例如,它可以 ...
- 工资低的.Net程序员,活该你工资低
这两天博客园上关于“.Net工资低”的讨论挺多的,让我不禁想起一句话“拉不出屎来怪地球没引力”. 那些抱怨“做.Net工作三年了月薪才6千,我的同学做Java现在都一万二”的哥们,你问问自己“我会什么 ...