View.requestLayout()

本文详细解析了View.requestLayout()的调用流程及其作用,解释了何时需要调用此方法以触发重新布局。同时对比了requestLayout()与invalidate()在刷新视图时的不同,指出在布局参数改变或需要重新布局时应使用requestLayout(),而在仅需视图重绘时使用invalidate()。
摘要由CSDN通过智能技术生成

View.requestLayout()

当一个View需要parent view重新调用他的onMeasure onLayout来对重新设置自己位置时,特别是当你修改了view的layoutparameter,它的值还没能应用到view上,调用这个方法就可以了,但是要注意parent view的onLayout是怎么实现的。

requestLayout:当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置。 特别的当view的layoutparameter发生改变,并且它的值还没能应用到view上,这时候适合调用这个方法。


Call this when something has changed which has invalidated the layout of this view. This will schedule a layout pass of the view tree.

我们可以理解为重新布局了一下view;


用途:有时我们在改变一个view 的内容之后可能会造成显示出现错误,比如写ListView的时候 重用convertview中的某个TextView 可能因为前后填入的text长度不同而造成显示出错,此时我们可以在改变内容之后调用requestLayout方法加以解决。


Invalidate和postInvalidate和requestLayout都是用来刷新view控件的:

  1. 主线程可以直接调用Invalidate()方法刷新。

  2. 子线程可以直接调用postInvalidate()方法刷新。

  3. API的描述是这样的 : Invalidatethe whole view. If the view is visible, onDraw(Canvas) will be called at somepoint in the future. This must be called from a UI thread. To call from anon-UI thread, call postInvalidate().。当Invalidate()被调用的时候,View的OnDraw()就会被调用,Invalidate()必须是在UI线程中被调用,如果在新线程中更新视图的就调用postInvalidate()。

  4. View.requestLayout() 请求重新布局,重新调用:onMeasure,onLayout,onDraw;

    View.invalidate()        刷新视图,相当于调用View.onDraw()方法


第一部分 :   requestLayout的流程

     当一个View调用requestLayout的时候,会给当前的View设置一个FORCE_LAYOUT标记。由此向ViewParent请求布局。这样从这个View开始向上一直requestLayout。最终到达ViewRootImpl。ViewParent 就是当前的传输链。【参见职责链设计模式】

   

    第一步:

     ViewRootImpl发现请求了布局。那么就会调用measure方法。

     measure方法确认当前View是否有FORCE_LAYOUT标记。

     如果有,那么就会进行重新measure。并且设置标记LAYOUT_REQUIRED。

    

Java 代码   收藏代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值