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。

时间: 2024-10-15 04:37:55

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的

Android源代码下载方法具体解释

作者:张星 相信非常多下载过内核的人都对这个非常熟悉 git clone git://android.git.kernel.org/kernel/common.git kernel 可是这是在曾经,如今假设这么运行的话,会显演示样例如以下内容 Initialized empty Git repository in /home/star/working/kernel/.git/ android.git.kernel.org[0: 149.20.4.77]: errno=Connection ref

Android之Inflate()方法用途

转自:http://blog.csdn.net/andypan1314/article/details/6715928 Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能.最近做的一个项目就是这一点让我迷茫了好几天. android上还有一个与Inflate()类似功能的方法叫findViewById(),二者有时均可使用,但也有区别 区别在于: 如果你的Activity里用到别的layout,比如对话框layout,你还要设置这个layo

Android pendingInten 使用方法具体解释

pendingIntent字面意义:等待的.未决定的Intent. 要得到一个pendingIntent对象,用法类的静态方法 getActivity(Context, int, Intent, int),getBroadcast(Context, int, Intent, int),getService(Context, int, Intent, int)  分别相应着Intent的3个行为,跳转到一个activity组件.打开一个广播组件和打开一个服务组件. 參数有4个,比較重要的事第三个和

Android fragment onHiddenChanged方法具体解释

项目中.为了实现不同fragment之间值得传递,首先想到的是利用bundle或者shareprefercnce之类的共享数据机制,当不符合项目需求,有点过于复杂和冗余,就利用网上一位前辈的建议.在主Activity中,创建一个共享的数据变量,在其它fragment中仅仅要获取到这个值就能够得到数据,实现共享.代码例如以下: 主activity定义一个共享数据变量: private String instrName; public String getInstrName() { return i

[Android]libpng error: Not a PNG file错误解决

我在将以前在Eclipse中写的项目import到android studio中后,出现了 AAPT err(Facade for 157667509): libpng error: Not a PNG file 错误,提示信息显示图片非PNG格式. 解决方法: 在studio中依次点开每个后缀名为png的图片,(如图) 即使图片的后缀名是png,这里会显示真正的格式.找到不符合要求的图片,另存为png格式即可.

使用net.sf.json包提供的JSONObject.toBean方法时,日期转化错误解决办法

解决办法: 需要在toBean之前添加配置 String[] dateFormats = new String[] {"yyyy-MM-dd HH:mm:ss"}; JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(dateFormats)); Map<String, Class> classMap = new HashMap<String, Class>(); MemberPlayLo

Android编程之LayoutInflater的inflate方法实例

假设你不关心其内部实现,仅仅看怎样使用的话,直接看这篇就可以. 接上篇,接下来,就用最最简单的样例来说明一下: 用两个布局文件main 和 test: 当中,main.xml文件为: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layo

Android - LayoutInflater和inflate方法的用法

在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化:而findViewById()是找xml布局文件下的具体widget控件(如 Button.TextView等). 具体作用: 1.对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入: 2.对于一个已经载入的界面,就可以使用Activiyt