关于onFinishInflate的一些事
这个方法相信大家都不会陌生,大家都知道这个方法在onCreate之后执行,要拿到控件宽高要onWindowFocusChanged方法之后才能拿到,平时自定义控件的时候自己也用的不少。但是今天接口有一个要求,让请求每次进这个页面的时候都发一次,我看了一下请求,是写在onFinishInflate里面的,请求只有第一次进入这个页面的时候会发,从下一个栈级返回的时候请求并不会发,一开始我还纳闷这个方法不是每次进入页面都会发的么,后面特意验证了一下
场景:A->B->C,AB两个页面都调用了相同的自定义控件,当第一进入A、B时,调用onFinishInflate,当C->B时,C页面出栈,B页面到栈顶并不会调用onFinishInflate
如图所示,从A->B->C->B->A,照理应该打印四次,但是实际只打印了两次
/** * Finalize inflating a view from XML. This is called as the last phase * of inflation, after all child views have been added. * * <p>Even if the subclass overrides onFinishInflate, they should always be * sure to call the super method, so that we get called. */
@CallSuper
protected void onFinishInflate() {
}
看源码,当XML布局文件被布局加载完,所有子控件均被映射之后,才会回调这个方法,但是C页面出栈,B页面到栈顶时,B页面在入栈时已经加载过了,就没有再加载一次调用这个方法。
附录:VIEW的生命周期
1.View生命周期相关方法
View的生命周期从构造方法开始依次执行以下几个方法,该View的可见性为默认值时:
(0)Constructors()
View在代码中被创建时调用第一种构造方法,View从layout中加载出来时会被调用第二种构造方法,其中XML中的属性也会被解析。
(1)onFinishInflate()
该方法当View及其子View从XML文件中加载完成后触发调用。通常是在Activity中的onCreate方法调用后调用。
(2)onVisibilityChanged()
该方法在当前View或其祖先的可见性改变时被调用。如果View状态不可见或者GONE,该方法会第一个被调用。
(3)onAttachedToWindow()
当View被附着到一个窗口时触发。在Activity第一次执行完onResume方法后被调用。
(4)onMeasure()
该方法确定View以及其子View尺寸大小时被调用。
(5)onSizeChanged()
该方法在Measure方法之后且测量大小与之前不一样的时候被调用。
(6)onLayout()
该方法在当前View需要为其子View分配尺寸和位置时会被调用。
(7)onDraw(Canvas)
该方法用于View渲染内容的细节。
(8)onWindowFocusChanged()
该方法也可能在绘制过程中被调用,具体是在包含当前View的Window获得或失去焦点时被调用。此时可以设置代码中定义的View的一些LayoutParameter。
如果View进入了销毁阶段,肯定是会被调用的。
(9)onWindowVisibilityChanged()
该方法同上,具体是在包含当前View的Window可见性改变时被调用。
(10)onDetachedFromWindow()
当View离开附着的窗口时触发,比如在Activity调用onDestroy方法时View就会离开窗口。和一开始的AttachedToWindow相对,都只会被调用一次。
因此可以总结为:
(1)在Activity的onCreate方法中加载View,View的onFinishInflate会被调用,继而Activity的生命周期执行到onResume方法之后View才被附着到窗口上,继而进行绘制工作,onMeasure、onSizeChanged 、onLayout、onDraw。这几个方法可能由于setVisible或onResume被调用多次,最后是Window失去焦点后的销毁阶段。
(2)onVisibilityChanged()方法在View是可见状态时如上所示时机调用,但是View的状态如果是不可见或者GONE时,是首先被调用的。如果是Invisible状态,View的创建到layout即结束,不会绘制出来。如果是GONE状态,View也会被加载并添加到Window,但是不会再Measure、Layout和Draw了。也就时说即使是GONE状态,销毁时一样有Detach的过程,即View的销毁过程和可见性无关。
2.View其他的一些生命周期相关方法
onFocusChanged()
该方法在当前View获得或失去焦点时被调用。
onKeyDown()
该方法在有按键按下后被调用。
onKeyUp()
与上面对应,该方法在有按键按下后弹起时触发。
onTrackballEvent()
该方法在一个轨迹球运动事件发生时被调用。
onTouchEvent()
该方法在触屏事件发生时被调用。
onSaveInstanceState()
这个方法就不用说了,在Activity被Pause的时候被调用。被Pause后回到界面时View就没方法被调用了。只有在比如Activity被销毁时进入View的销毁流程。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38453.html