removeAllViews()和removeAllViewsInLayout()之间有什么区别

时间:2012-08-14 12:50:26

标签: android android-layout

我正在动态填充线性布局。根据响应,我必须清除过去的子视图并创建新视图。我已阅读该文档,但仍然与这对方法混淆,它们看起来都是相同的功能。我应该使用哪种功能。

3 个答案:

答案 0 :(得分:23)

斯科特比格斯指出,差异并不大。唯一的区别是removeAllViews()之后会调用requestLayout()invalidate()。这种差异的关键在于理解removeAllViewInLayout()的命名。令人困惑的是,它的意思并不是“删除此视图布局中的所有视图。”

If we look at the similar method, removeViewInLayout(), we can understand what it's supposed to mean:

  

在布局期间删除视图。如果在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()