负责的一个新手引导的需求,友盟上报 Android 4.3(API 18) 的机型(公司APP 最低支持的安卓版本即为 4.3)中会出现 NullPointerException 的 bug。
百度后知道了原因:http://blog.csdn.net/chengxu_hou/article/details/74940938。原来,只要是在 4.3 及以下的系统中调用 RelativeLayout.mesure() 方法,就会出现空指针的问题,是因为源码没有做判空处理;4.4 及以上由于修复了系统源码,就不会出现该问题了。
再看看我的bug,我的 Dialog 的 xml 根布局的确是 RelativeLayout,并且在 Dialog 的构造方法中调用了 mesure() 方法:
解决方法:
(第一种方法最简单,推荐之)
1、使用 inflate 初始化布局时,尽量设置父视图(parent)
contentView = LayoutInflater.from(context).inflate(layoutResId, parent, false);
2、显式设置 LayoutParams
contentView = LayoutInflater.from(context).inflate(layoutResId, null);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
contentView.setLayoutParams(params);
3、老老实实修改布局,不使用 RelativeLayout ~
总结
在使用 RelativeLayout 并且需要手动 measure 时,要注意可能出现空指针的问题。