解決方案:需要主動測量控件的根節點不能為RelativeLayout ,把RelativeLayout 修改為LinearLayout即可
在寫自定義控件的時候,想要給一個控件設置paddingTop為自身高度的負數進行隱藏,但是在進行測量的時候報錯
報錯信息的如下Caused by: android.view.InflateException
檢查錯誤日志發現出現錯誤的代碼在
headerView.measure(0, 0);這一行,主動測量控件的時候報錯
public SuperListView(Context context, AttributeSet attrs) { super(context, attrs); initListViewHeader(); } /** * 初始化ListView的一個頭布局 */ private void initListViewHeader() { headerView = View.inflate(getContext(), R.layout.super_listview_header, null); this.addHeaderView(headerView); //手動觸發繪制 headerView.measure(0, 0); headerHeight = headerView.getMeasuredHeight(); System.out.println(headerHeight); headerView.setPadding(0, -headerHeight, 0, 0); }
解決方式
經過查詢資料后發現,因為我的headerView使用的根節點是RelativeLayout ,把RelativeLayout 修改為LinearLayout即可
網上有些資料說是因為RelativeLayout沒有重寫onMeasure(x,x)方法,但是查看源碼可知,它其實重寫了.
LinearLayout中重寫了onMeasure(X,X)方法
而在RelativeLayout 中,也是重寫了onMeasure(xx)方法的,不過谷歌有特殊標注,這種測量方法並不能適用所有情況,那么出現報錯的原因可能就是因為這種測量方法的問題.
因為時間關系,具體源碼就沒有研究了,等有時間再看吧