解决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)方法的,不过谷歌有特殊标注,这种测量方法并不能适用所有情况,那么出现报错的原因可能就是因为这种测量方法的问题.

  

  因为时间关系,具体源码就没有研究了,等有时间再看吧

原文地址:https://www.cnblogs.com/adventurer/p/5632244.html