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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值