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

我正在dynamic地填充线性布局。 根据反应,我必须清除过去的孩子的观点,并创造新的观点。 我已经阅读了这个文档,但是仍然和这两个方法混淆了,它们看起来都是一样的function。 我应该使用哪个function。

removeAllViews():调用此方法从ViewGroup中删除所有的子视图。 removeAllViewsInLayout():被ViewGroup的子类调用,当它必须首先知道它在屏幕上的大小之前,它可以计算它将呈现多less个子视图。

干杯!

正如斯科特·比格斯(Scott Biggs)指出的那样,差别并不大。 唯一的区别是removeAllViews() invalidate()事后调用requestLayout()invalidate() 。 这个区别的关键在于理解removeAllViewInLayout()的命名。 令人困惑的是,它的含义并不是“删除此视图布局中的所有视图”。

如果我们看看类似的方法removeViewInLayout(),我们可以理解它应该是什么意思:

在布局中删除视图。 如果在你的onLayout()方法中,这是很有用的,你需要删除更多的视图。

所以removeAllViewsInLayout()实际上意味着“删除所有视图,我们在布局过程中调用这个方法(即onLayout())”。 这就是为什么removeAllViewsInLayout()不会调用requestLayout() ,因为它假定您已经在布局阶段,因此请求另一个布局阶段是不必要的。

如果您使用removeAllViewsInLayout() ,那么您有责任确保在布局过程中调用此方法,或者根据需要正确调用requestLayout()invalidate()方法。

那么,从源头上看,没有太大的区别:

 public void removeAllViews() { removeAllViewsInLayout(); // Details implemented here requestLayout(); invalidate(true); } 

所以除非你想在你select的时候调用invalidate() ,否则你可以使用removeAllViews()并保存一些input。

编辑
有关更详细的解释,请参阅David Lui的回答。 总结一下,除非你正在构build一个视图的过程中使用removeAllViews() ,在这种情况下,你会调用removeAllViewsInLayout()