57

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

4

3 回答 3

34

正如 Scott Biggs 指出的那样,差异并不大。唯一的区别是removeAllViews()调用requestLayout()invalidate()之后。之所以会出现这种差异,关键在于理解removeAllViewInLayout(). 令人困惑的是,它的含义并不是“删除此视图布局中的所有视图”。

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

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

所以removeAllViewsInLayout()实际上意味着“删除所有视图,并且我们在布局传递期间调用此方法(即 onLayout())”。这就是为什么removeAllViewsInLayout()不调用 to的原因requestLayout(),因为它假定您当前已经在布局通道中,因此不需要请求另一个布局通道。

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

于 2016-07-14T22:25:43.783 回答
21

removeAllViews():调用此方法从 ViewGroup 中删除所有子视图。 removeAllViewsInLayout():由 ViewGroup 子类调用以从其自身中删除子视图,此时它必须首先知道其在屏幕上的大小,然后才能计算它将呈现多少子视图。

于 2013-03-22T13:30:17.653 回答
13

好吧,看看源代码,没有太大区别:

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

因此,除非您想invalidate()在您选择的时间打电话,否则您最好使用removeAllViews()并节省一些打字时间。

编辑
有关更详细的解释,请参阅David Lui的回答。总而言之,removeAllViews()除非您正在构建视图,否则请使用 - 在这种情况下,您将调用removeAllViewsInLayout().

于 2016-06-24T16:30:21.573 回答