首页 > 代码库 > Android layoutInflate.inflate 方法详解,removeView()错误解决
Android layoutInflate.inflate 方法详解,removeView()错误解决
错误:
The specified child already has a parent. You must call removeView()。
解答:
这个错误很直白,就是你viewGroup.addView(childView); 中childView已经有父View了。错误原因很多,我主要讲下 mLayoutInflater.inflate(id, rootView, false);造成的这个错误。(该方法有两种,一种是2个参数,一种是3个参数)。
2个参数:
第一个参数:layout的XML文件id;
第二个参数:将XML文件中的根view,作为子View添加到的那个父View。也就是父View布局
a:如果rootView非空,方法返回值是rootView(rootView已添加xml代表的子View);
b:如果rootView为空,方法直接返回子View(xml代表的子View);那么XML文件中的LayoutParams就无效了,(因为LayoutParams是给该XML代表的View的父View使用。在父View的onMeasure()中根据LayoutParams是MATCH_PARENT还是WRAP_CONTENT,来测量子View的大小。如果没有父View就没必要了)
故用mLayoutInflater.inflate(id, rootView);返回的实际上是rootView,而rootView肯定已经有父布局了(DecorateView,系统生成的)。所以 rootView.addView(mLayoutInflater.inflate(id, rootView)).等价于rootView.addView(rootView).所以错了。
3个参数:
问题来了,怎样修复b情况,既保留XML文件中的LayoutParams属性,又不想有方法return父View。
两步 rootView != null (是那个对象随便),第三个参数 == false;mLayoutInflater.inflate(id, rootView, false);这样就可以不attach root view,又保留LayoutParams。
Android layoutInflate.inflate 方法详解,removeView()错误解决
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。