最近发现通过继承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