与removeAllViewsInLayout(),postInvalidate()和refreshDrawableState()混淆

时间:2011-11-24 01:18:46

标签: android

我对这三个功能感到困惑:removeAllViewsInLayout()postInvalidate()refreshDrawableState()

removeAllViewsInLayout()

当我在我的程序中使用removeAllViewsInLayout()时,所有视图都消失了。但是当触发postInvalidate()刷新时,什么也没有。我认为removeAllViewsInLayout()删除了我的所有观点。有没有办法清除我视图中的所有内容但不删除它?

postInvalidate()

我想刷新我的观点。但是对于refreshDrawableState(),我只能做一次,为什么?

1 个答案:

答案 0 :(得分:9)

如果您致电postInvalidate()(或只是在UI线程上调用invalidate()),系统将安排重新绘制您的视图。然后,您的onDraw()方法可以执行任何操作,包括仅绘制空白画布。

如果您致电removeAllViewsInLayout(),它会执行此操作 - 删除所有视图,包括您的自定义视图。你可能不想这样做。 (编辑:removeAllViewsInLayout()仅作为ViewGroup的布局计算的一部分进行调用。典型的用途是ViewGroup“拥有”大量视图但在此过程中onLayout()处理决定仅显示实际适合屏幕的子项。如果您不在计算视图布局,则应调用removeAllViews()。)

调用refreshDrawableState()仅在您的视图使用对视图状态敏感的Drawable对象时才有用。例如,按钮将使用此按钮,以便在按下按钮时背景可绘制更改颜色。对于你正在做的事情,你也不需要打扰这个方法。