在LayoutInflater.inflate(resource,root,true)之后removeView无法正常工作

Ema*_*lin 6 android view viewgroup

我动态地添加和删除视图到自定义视图(FrameLayout)执行此操作:

LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mMyView = inflater.inflate(resId, this, true);
Run Code Online (Sandbox Code Playgroud)

稍后我尝试删除视图,但视图不会删除:

removeView(mMyView);
Run Code Online (Sandbox Code Playgroud)

如果我这样做,一切都按预期工作:

mMyView = inflater.inflate(resId, this, **false**);
addView(mMyView);
Run Code Online (Sandbox Code Playgroud)

唯一的区别是我手动添加视图而不是让inflate调用.有谁知道为什么这会有所作为?

Ema*_*lin 17

答案就在于这个电话

mMyView = inflater.inflate(resId, this, true);
Run Code Online (Sandbox Code Playgroud)

文件说明:

返回膨胀层次结构的根视图.如果提供了root并且attachToRoot为true,则为root; 否则它是膨胀的XML文件的根.

http://developer.android.com/reference/android/view/LayoutInflater.html#inflate(int,android.view.ViewGroup,boolean)

我假设膨胀调用总是返回膨胀布局的根(由resId定义),但是如果提供了root参数并且attachToRoot为true,那么它是布局的根,膨胀布局被添加到(它是新的父视图)和那是根(在这种情况下,root == this).

所以虽然

mMyView = inflater.inflate(resId, this, false);
Run Code Online (Sandbox Code Playgroud)

将视图分配给我们稍后要删除的mMyView

mMyView = inflater.inflate(resId, this, true);
Run Code Online (Sandbox Code Playgroud)

指定该视图的父级.调用removeView(mMyView)实际上与removeView(this)完全相同,显然没有做任何事情.

这种行为是IMO非常反直觉,容易出错.当我们已经使用root参数的根布局而我们还没有对膨胀布局的引用时,为什么它应该返回根布局而不是膨胀布局?