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文件的根.
我假设膨胀调用总是返回膨胀布局的根(由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参数的根布局而我们还没有对膨胀布局的引用时,为什么它应该返回根布局而不是膨胀布局?