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()
。