我正在动态填充线性布局。根据响应,我必须清除过去的子视图并创建新视图。我已经阅读了文档,但仍然对这几种方法感到困惑,它们看起来都具有相同的功能。我应该使用哪个功能。
3 回答
正如 Scott Biggs 指出的那样,差异并不大。唯一的区别是removeAllViews()
调用requestLayout()
和invalidate()
之后。之所以会出现这种差异,关键在于理解removeAllViewInLayout()
. 令人困惑的是,它的含义并不是“删除此视图布局中的所有视图”。
如果我们看一下类似的方法,removeViewInLayout(),我们可以理解它应该是什么意思:
在布局期间删除视图。如果在 onLayout() 方法中需要删除更多视图,这很有用。
所以removeAllViewsInLayout()
实际上意味着“删除所有视图,并且我们在布局传递期间调用此方法(即 onLayout())”。这就是为什么removeAllViewsInLayout()
不调用 to的原因requestLayout()
,因为它假定您当前已经在布局通道中,因此不需要请求另一个布局通道。
如果您使用removeAllViewsInLayout()
,那么您有责任确保在布局过程中调用它,或者根据需要正确requestLayout()
调用invalidate()
。
removeAllViews()
:调用此方法从 ViewGroup 中删除所有子视图。
removeAllViewsInLayout()
:由 ViewGroup 子类调用以从其自身中删除子视图,此时它必须首先知道其在屏幕上的大小,然后才能计算它将呈现多少子视图。
好吧,看看源代码,没有太大区别:
public void removeAllViews() {
removeAllViewsInLayout(); // Details implemented here
requestLayout();
invalidate(true);
}
因此,除非您想invalidate()
在您选择的时间打电话,否则您最好使用removeAllViews()
并节省一些打字时间。
编辑
有关更详细的解释,请参阅David Lui的回答。总而言之,removeAllViews()
除非您正在构建视图,否则请使用 - 在这种情况下,您将调用removeAllViewsInLayout()
.