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

L_Y*_*ing 54 android android-layout

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

Dav*_*Liu 27

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

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

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

所以removeAllViewsInLayout()实际上意味着"删除所有视图,我们在布局传递期间调用此方法(即onLayout())".这就是为什么removeAllViewsInLayout()不调用requestLayout(),因为假设你当前已经在布局传递中,所以不需要请求另一个布局传递.

如果您使用的removeAllViewsInLayout(),那么它是你的责任,以确保您正在布局传递过程中调用这个,或者正确地调用requestLayout()invalidate()按需要.

  • 哇,感谢您的深入解释!也许他们应该将其称为“removeAllViewsDuringLayoutConstruction()”,以避免介词 _in_ 的含糊使用。也许一些文档会有所帮助。不,完整的文档会让程序员心脏病发作。:) (2认同)

Ale*_*ndr 19

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

干杯!

  • 这是文档所说的一个令人愉快的版本,它就像泥巴一样清晰.View本身(如LinearLayout)不是一个从自身中删除子视图的ViewGroup子类吗?我们如何知道View是否必须首先知道它在屏幕上的大小才能计算它将呈现多少个子视图? (9认同)

Sco*_*ggs 12

那么,看看来源,没有太大区别:

public void removeAllViews() {
    removeAllViewsInLayout();   // Details implemented here
    requestLayout();
    invalidate(true);
}
Run Code Online (Sandbox Code Playgroud)

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

编辑
有关更详细的解释,请参阅David Lui的回答.总结一下,removeAllViews()除非你正在构建一个View ,否则请使用它- 在这种情况下你要调用它removeAllViewsInLayout().