【解决了什么问题?】:requestLayout()

100 阅读2分钟

在 Android 中,requestLayout() 方法可以用于请求重新布局视图树,即告诉系统需要重新计算和绘制视图。

具体来说,requestLayout() 方法会触发以下操作:

  1. 标记视图需要重新布局:调用 requestLayout() 方法会标记当前视图及其父视图需要进行重新布局,即系统会将 mPrivateFlags 中的 PFLAG_FORCE_LAYOUT 标志位置为 true,以便在下一次测量和布局时重新计算视图的尺寸和位置。

  2. 通知父视图需要重新布局:如果当前视图的父视图也需要重新布局,系统会递归调用父视图的 requestLayout() 方法,以便将整个视图树标记为需要重新布局。

  3. 通知系统需要重新绘制:调用 requestLayout() 方法会通知系统需要重新绘制视图,即系统会将 mPrivateFlags 中的 PFLAG_DRAWN 标志位置为 false,以便在下一次绘制时重新绘制视图。

使用requestLayout() 方法可以解决以下问题:

  1. 视图尺寸和位置变化:当视图的尺寸和位置发生变化时,调用 requestLayout() 方法可以通知系统需要重新计算和布局视图,以便正确显示视图的尺寸和位置。

  2. 视图内容变化:当视图的内容发生变化时,例如添加或删除子视图、设置文本或图片等,调用 requestLayout() 方法可以通知系统需要重新计算和布局视图,以便正确显示视图的内容。

需要注意的是,requestLayout() 方法并不会立即触发重新布局和绘制视图,而是将其标记为需要重新布局和绘制,具体的操作会在下一次消息循环中执行。因此,如果需要立即重新布局和绘制视图,可以配合 invalidate() 方法使用,例如:

view.requestLayout();
view.invalidate();

这样可以保证在下一次消息循环中立即重新布局和绘制视图。

但是

频繁地调用 requestLayout()invalidate() 方法会导致性能问题,因此应该尽量避免不必要的调用。