負責的一個新手引導的需求,友盟上報 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 時,要注意可能出現空指針的問題。