解決xxview.measure(0, 0)主動測量控件報錯 android.view.InflateException


  解決方案:需要主動測量控件的根節點不能為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)方法的,不過谷歌有特殊標注,這種測量方法並不能適用所有情況,那么出現報錯的原因可能就是因為這種測量方法的問題.

  

  因為時間關系,具體源碼就沒有研究了,等有時間再看吧

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM