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

      

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

  • 相关阅读:
    算法浅谈——一文讲透三分算法
    机器学习基础——一文讲懂中文分词算法
    线性代数精华2——逆矩阵的推导过程
    LeetCode 2 Add Two Numbers——用链表模拟加法
    LeetCode 1 Two Sum——在数组上遍历出花样
    大数据基石——Hadoop与MapReduce
    Flexbox布局
    对象基础
    对象枚举属性
    我的第一篇博文
  • 原文地址:https://www.cnblogs.com/adventurer/p/5632244.html
Copyright © 2011-2022 走看看