我正在动态填充线性布局。根据响应,我必须清除过去的子视图并创建新视图。我已阅读该文档,但仍然与这对方法混淆,它们看起来都是相同的功能。我应该使用哪种功能。
答案 0 :(得分:23)
斯科特比格斯指出,差异并不大。唯一的区别是removeAllViews()
之后会调用requestLayout()
和invalidate()
。这种差异的关键在于理解removeAllViewInLayout()
的命名。令人困惑的是,它的意思并不是“删除此视图布局中的所有视图。”
在布局期间删除视图。如果在onLayout()方法中,您需要删除更多视图,这非常有用。
所以removeAllViewsInLayout()
实际上意味着“删除所有视图,我们在布局传递期间调用此方法(即onLayout())”。这就是removeAllViewsInLayout()
没有调用requestLayout()
的原因,因为它假设您当前已经在布局传递中,因此不需要请求另一个布局传递。
如果您使用removeAllViewsInLayout()
,那么您有责任确保在布局过程中调用此内容,或者根据需要正确调用requestLayout()
和invalidate()
。
答案 1 :(得分:18)
removeAllViews(): - 调用此方法从ViewGroup中删除所有子视图。 removeAllViewsInLayout():由一个ViewGroup子类控制,从它自己删除子视图,当它必须首先知道它在屏幕上的大小,然后才能计算它将渲染的子视图数。
干杯!
答案 2 :(得分:11)
嗯,看看消息来源,没有多大区别:
public void removeAllViews() {
removeAllViewsInLayout(); // Details implemented here
requestLayout();
invalidate(true);
}
因此,除非你想在你选择的时候致电invalidate()
,否则你也可以使用removeAllViews()
并节省一些打字。
EDIT
有关更详细的说明,请参阅David Lui的答案。总结一下,除非您正在构建视图,否则请使用removeAllViews()
- 在这种情况下,您需要调用removeAllViewsInLayout()
。