問題由來
最近開始嘗試使用Kotlin,體驗(yàn)如下

這種直接調(diào)用控件id進(jìn)行的操作,發(fā)現(xiàn)在Fragment中并不可以,會(huì)報(bào)錯(cuò):
Caused by: java.lang.IllegalStateException: xxx must not be null
不能直接使用控件id的原因是,xml文件還沒有載入。這就類似于在Activity中要在setContentView之后再使用findViewById。
解決方法
重寫了Fragment的onViewCreated方法,在這個(gè)方法內(nèi)部對控件進(jìn)行操作。但是在Fragment的官方文檔中卻沒有出現(xiàn)過這個(gè)方法,所以自己來捋一下Fragment的聲明周期。
Fragment的生命周期
先放兩張經(jīng)典的圖
Fragment的生命周期:

Fragment 生命周期
Activity和Fragment生命周期對比:

觀察生命周期
重寫了圖中所有方法以及onViewCreated方法,在方法內(nèi)打印方法名
切換到該Fragment
2018-12-11 15:58:00.750 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onAttach
2018-12-11 15:58:00.750 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onCreate
2018-12-11 15:58:00.750 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onCreateView
2018-12-11 15:58:00.756 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onViewCreated
2018-12-11 15:58:00.757 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onActivityCreated
2018-12-11 15:58:00.757 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onStart
2018-12-11 15:58:00.758 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onResume
返回
聲明:此處用的是Jetpack的Navigation,直接按返回鍵返回至nav_host_fragment
所以這個(gè)返回可以看做是銷毀該Fragment
2018-12-11 16:19:45.527 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onPause
2018-12-11 16:19:45.528 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onStop
2018-12-11 16:19:45.528 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onDestroyView
2018-12-11 16:19:46.006 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onDestroy
2018-12-11 16:19:46.007 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onDetach
熄屏(回到桌面)
2018-12-11 16:21:31.700 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onPause
2018-12-11 16:21:31.738 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onStop
解鎖(返回應(yīng)用)
2018-12-11 16:21:34.390 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onStart
2018-12-11 16:21:34.406 1683-1683/com.rimson.hellojetpack D/SecondFragment:: onResume
總結(jié)
- Fragment的生命周期比Activity多了一些,但總體對接的上。
- onViewCreated在onCreateView之后調(diào)用,所以控件操作可以在這個(gè)方法內(nèi)進(jìn)行。