文章目录
- 一 View生命周期几个重要的方法
- 1.`onFinishInflate`
- 2.`onVisibilityChanged`
- 3.`onAttachedToWindow`
- 4.`onMeasure`
- 5.`onLayout`
- 6.`onDraw`
- 二 View生命周期
- 1.该View从xml加载时,默认的状态为Visible:
- (1)加载完毕,显示出来:
- (2)状态从Visible变成InVisible:
- 状态再由InVisible变成Visible:
- (3)状态从Visible变成Gone:
- 状态再由Gone变成Visible:
- 2.该View从xml加载时,默认的状态为InVisible,加载完毕的时候:
- 3.该View从xml加载时,默认的状态为Gone,加载完毕的时候:
- 4.总结
最近项目不忙,所以将View的生命周期几个方法进行总结下,方便以后在项目中更好的去自定义View。
一 View生命周期几个重要的方法
1.onFinishInflate
该方法会在View从xml加载完之后,触发该方法。即在Activity的onCreate
中调用setContentView
时。该方法仅调用一次。
2.onVisibilityChanged
该方法会在View的状态发生变化的时候,触发该方法。即在主动调用setVisible
,Activity的生命周期onPause
、onResume
被调用的时。该方法会随着这些方法调用而被调用。
3.onAttachedToWindow
当View被加载到Window时,触发该方法。即在Activity第一次调用onResume
时。该方法仅在第一次加载到Window时调用。与之对应的onDetachedFromWindow
就是在View从Window上移除的时候,触发该方法。即在Activity调用onDestroy
时。
4.onMeasure
该方法用来测量该View以及子View的大小时被调用。该方法在View的状态为Gone的时候,并不会被调用到,但是状态为InVisible,会被调用到。
5.onLayout
该方法用来确定View和子View的位置和尺寸的时被调用。同样该方法在View的状态为Gone的时候,并不会被调用到,但是状态为InVisible,会被调用到。
6.onDraw
该方法用来渲染View的时候被调用。同样该方法在View的状态为Gone和InVisible的时候,都不会被调用到。
二 View生命周期
1.该View从xml加载时,默认的状态为Visible:
(1)加载完毕,显示出来:
onCreate->onFinishInflate->onResume->onAttachedToWindow->onVisibilityChanged ->onMeasure->onLayout->onDraw
(2)状态从Visible变成InVisible:
onVisibilityChanged
状态再由InVisible变成Visible:
onVisibilityChanged->onDraw
(3)状态从Visible变成Gone:
onVisibilityChanged
状态再由Gone变成Visible:
onVisibilityChanged->onMeasure->onLayout->onDraw
2.该View从xml加载时,默认的状态为InVisible,加载完毕的时候:
onCreate->onFinishInflate->onResume->onAttachedToWindow->onVisibilityChanged->onMeasure->onLayout
3.该View从xml加载时,默认的状态为Gone,加载完毕的时候:
onCreate->onFinishInflate->onResume->onAttachedToWindow->onVisibilityChanged
4.总结
(1)从生命周期方法的调用过程中,可以看到,onVisibilityChanged
会在View的状态发生变化的时候就会被调用到,例如主动调用setVisible
,Activity的生命周期onPause
、onResume
被调用的时候,都会触发onVisibilityChanged
。
(2)另外当View的可见状态的变化,也会触发不同的周期方法:状态由InVisible变成Visible,该控件只需要执行onDraw
即可,因为该控件在Window上是有占位的,在初始化加载该控件的时候,已经将该控件放置到Window上(即执行完onLayout
);相反的如果有Gone变为Visible,该控件需要依次进行重新测量、布局和绘制(即依次执行完onMeasure
->onLayout
->onDraw
),因为在初始化该控件的时候,并没有将该控件绘制到Window上。