我对这三个功能感到困惑:removeAllViewsInLayout()
,postInvalidate()
和refreshDrawableState()
。
removeAllViewsInLayout()
当我在我的程序中使用removeAllViewsInLayout()
时,所有视图都消失了。但是当触发postInvalidate()
刷新时,什么也没有。我认为removeAllViewsInLayout()
删除了我的所有观点。有没有办法清除我视图中的所有内容但不删除它?
postInvalidate()
我想刷新我的观点。但是对于refreshDrawableState()
,我只能做一次,为什么?
答案 0 :(得分:9)
如果您致电postInvalidate()
(或只是在UI线程上调用invalidate()
),系统将安排重新绘制您的视图。然后,您的onDraw()
方法可以执行任何操作,包括仅绘制空白画布。
如果您致电removeAllViewsInLayout()
,它会执行此操作 - 删除所有视图,包括您的自定义视图。你可能不想这样做。 (编辑:removeAllViewsInLayout()
仅作为ViewGroup
的布局计算的一部分进行调用。典型的用途是ViewGroup
“拥有”大量视图但在此过程中onLayout()
处理决定仅显示实际适合屏幕的子项。如果您不在计算视图布局,则应调用removeAllViews()
。)
调用refreshDrawableState()
仅在您的视图使用对视图状态敏感的Drawable
对象时才有用。例如,按钮将使用此按钮,以便在按下按钮时背景可绘制更改颜色。对于你正在做的事情,你也不需要打扰这个方法。