forceLayout(),requestLayout()和invalidate()的用法

我有点困惑的角色forceLayout()requestLayout()以及invalidate()该方法的View类。

什么时候可以叫他们?


郎朗坤
浏览 1467回答 3
3回答

DIEA

为了更好地理解FrançoisBOURLIEUX和Dalvik提供的答案,我建议您看一下Arpit Mathur的这张令人敬畏的视图生命周期图:

动漫人物

invalidate()invalidate()当您要计划重绘视图时,调用完成。这将导致onDraw最终(很快,但不是立即)被调用。自定义视图何时调用的一个示例是文本或背景颜色属性已更改。视图将被重绘,但是大小不会改变。requestLayout()如果关于视图的某些更改会影响大小,则应致电requestLayout()。这将触发onMeasure并onLayout不仅是这个观点,但一路上扬父视图的线。不能保证调用requestLayout()会导致onDraw(与接受的答案中的图相反),因此通常将其与结合使用invalidate()。invalidate();requestLayout();例如,自定义标签的text属性发生更改时。标签会改变尺寸,因此需要重新测量和重新绘制。forceLayout()当requestLayout()在父视图组上调用时,不需要重新测量并重传其子视图。但是,如果在重新测量和重排中应包括一个孩子,则可以呼叫forceLayout()该孩子。forceLayout()仅在子代requestLayout()与其直接父代一起出现时才对子代起作用。forceLayout()本身调用不会起作用,因为它不会触发requestLayout()视图树。阅读此问答以获取有关的详细说明forceLayout()。

暮色呼如

正如您在代码中所forceLayout()看到的那样,它仅将视图标记为“需要重新布局”,但是它既没有计划也没有触发该重新布局。重新布局将不会发生,直到将来某个时候由于其他原因布置视图的父级。使用forceLayout()和时,还有一个更大的问题requestLayout():假设您已经调用forceLayout()了一个视图。现在,当调用requestLayout()该视图的后代时,Android将递归调用requestLayout()该后代的祖先。问题是它将在您调用的视图处停止递归forceLayout()。因此,该requestLayout()调用将永远不会到达视图根,因此也不会调度布局遍历。视图层次结构的整个子树都在等待布局,并且调用requestLayout()该子树的任何视图都不会导致布局。仅requestLayout()在该子树之外调用任何视图都会破坏该咒语。我会考虑的实现forceLayout()(以及它如何requestLayout()受到破坏,因此您永远不要在代码中使用该函数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android