码迷,mamicode.com
首页 > 移动开发 > 详细

Android layoutInflate.inflate 方法详解,removeView()错误解决

时间:2014-12-22 19:39:24      阅读:331      评论:0      收藏:0      [点我收藏+]

标签:android   layoutinflater   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为空,方法直接返回子Viewxml代表的子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()错误解决

标签:android   layoutinflater   removeview   布局   

原文地址:http://blog.csdn.net/zhjali123/article/details/42082861

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!