为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

郎朗坤 2019-11-04 15:48:43
我有点困惑的角色forceLayout(),requestLayout()以及invalidate()该方法的View类。什么时候可以叫他们?
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

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

//img1.sycdn.imooc.com//5dbfd7f60001fceb06001060.jpg

查看完整回答
反对 回复 2019-11-04
?
动漫人物

TA贡献1815条经验 获得超10个赞

invalidate()

invalidate()当您要计划重绘视图时,调用完成。这将导致onDraw最终(很快,但不是立即)被调用。自定义视图何时调用的一个示例是文本或背景颜色属性已更改。


视图将被重绘,但是大小不会改变。


requestLayout()

如果关于视图的某些更改会影响大小,则应致电requestLayout()。这将触发onMeasure并onLayout不仅是这个观点,但一路上扬父视图的线。


不能保证调用requestLayout()会导致onDraw(与接受的答案中的图相反),因此通常将其与结合使用invalidate()。


invalidate();

requestLayout();

例如,自定义标签的text属性发生更改时。标签会改变尺寸,因此需要重新测量和重新绘制。


forceLayout()

当requestLayout()在父视图组上调用时,不需要重新测量并重传其子视图。但是,如果在重新测量和重排中应包括一个孩子,则可以呼叫forceLayout()该孩子。forceLayout()仅在子代requestLayout()与其直接父代一起出现时才对子代起作用。forceLayout()本身调用不会起作用,因为它不会触发requestLayout()视图树。


阅读此问答以获取有关的详细说明forceLayout()。


查看完整回答
反对 回复 2019-11-04
?
暮色呼如

TA贡献1853条经验 获得超9个赞

正如您在代码中所forceLayout()看到的那样,它仅将视图标记为“需要重新布局”,但是它既没有计划也没有触发该重新布局。重新布局将不会发生,直到将来某个时候由于其他原因布置视图的父级。


使用forceLayout()和时,还有一个更大的问题requestLayout():


假设您已经调用forceLayout()了一个视图。现在,当调用requestLayout()该视图的后代时,Android将递归调用requestLayout()该后代的祖先。问题是它将在您调用的视图处停止递归forceLayout()。因此,该requestLayout()调用将永远不会到达视图根,因此也不会调度布局遍历。视图层次结构的整个子树都在等待布局,并且调用requestLayout()该子树的任何视图都不会导致布局。仅requestLayout()在该子树之外调用任何视图都会破坏该咒语。


我会考虑的实现forceLayout()(以及它如何requestLayout()受到破坏,因此您永远不要在代码中使用该函数。


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 1466 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信