您的位置:首页 > 运维架构

解决4.0以下继承PopupWindow报空指针的bug

2015-01-14 13:40 274 查看
最近发现通过继承PopupWindow的自定义弹窗在4.0以下版本中闪退,报NullPointerException.在网上找了一些回答,都不靠谱,没有解决问题.

最好只好通过自己查看源码找出原因。

首先查看报错信息,逐步分析



发现PopupWindow.setContentView方法报错,到源码级了,首先想到对象的构建过程,通过继承父类,实例化的时候会先调用父类的构造函数,一般都没有指定,所以调用的是父类默认的构造函数,现在来看看源码

发现Popwindow有这些构造函数,默认是不带参数的,从PopupWindow()





已经找到报错的方法setContentView()

直接查看代码



发现这里没有判断就直接调用了,所以运行就报 空指针了。

我们再来看看为什么4.0以上版本没有问题。

直接查看4.0源码中这个方法的代码



这里加了一个非空判断,所以就没有问题了。这里感叹一下,谷歌的大神们竟然会犯这么低级的错误,幸好还是在新版中更正过来了。这里也说明了代码的健壮性很重要。

知道原因了,解决此问题就好办了,我的方法是,竟然默认构造方法出错,我们就不调用默认的,首先我们看看源码



发现其实有两套构造方法,我们选择传入Context试一试,就是在自定义PopupWindow构造函数中第一行加入super(Context)

例:

public class MyPopWin extends PopupWindow {
public CategoryDialog(Context context) {
super(context);
//......
}
}
发现不会报错了。

很多时候查看源码会有一些意想不到的东西。

转载请注明出处.http://blog.csdn.net/za5419479/article/details/42708757
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息