DevLog 11.1 LocalDate & DialogFragment
參考內(nèi)容:
1. Java 8新特性(四):新的時(shí)間和日期API:?https://lw900925.github.io/java/java8-newtime-api.html
使用LocalDate而不是Calendar、SimpleDateFormat?
使用SimpleDateFormat可能會(huì)出現(xiàn)以下問題:
構(gòu)建SimpleDateFormat的開銷大
?SimpleDateFormat.format parse是線程不安全
LocalDate 的簡(jiǎn)單使用:
其中with接受一個(gè)TemporalAdjuster函數(shù)接口,其中接受一個(gè)Temporal參數(shù),它是LocalDate的父類。API中給出的其他的TemporalAdjuster的相關(guān)實(shí)現(xiàn)有:

但是LocalDate直到Api26 Oreo才支持,所以需要使用joda-time這些類。

DialogFragment
DialogFragment = Dialog + Fragment

Dialog具有自己的window,會(huì)自行處理點(diǎn)擊事件,并且會(huì)自行決定什么時(shí)候disappear。
Dialog中Window創(chuàng)建的時(shí)機(jī)
Dialog的生命周期
onCreate show onStart cancel onDismiss Stop
AlertDialog#show 的執(zhí)行流程:

AlertDialog#create:
所以,AlertDialog#create這一步實(shí)質(zhì)上是將window進(jìn)行初始化,但是View并沒有添加到window中(View添加到Window中的標(biāo)志應(yīng)該是調(diào)用WindowManager#addView)。
Dialog#show

從圖上我們可以看到Dialog的onCreate的調(diào)用是在show方法中,并且是在show中將傳入的View參數(shù)添加到了Window中,我們簡(jiǎn)要的看看代碼:
最后調(diào)用了一個(gè)sendShowMessage方法,這個(gè)方法會(huì)關(guān)聯(lián)到這個(gè)Handler的實(shí)現(xiàn)類:
這三個(gè)回調(diào)接口都是定義在Dialog相關(guān)的頂級(jí)父類DialogInterface中的,因此我們可以通過設(shè)置回調(diào)函數(shù)監(jiān)聽Dialog的一些行為:
DialogFragment
好像繞的有點(diǎn)遠(yuǎn),那我們回到我們的正題DialogFragment。

其實(shí)DialogFragment就是Fragment,只不過其中有一個(gè)Dialog的實(shí)例。DialogFragment給我了更為簡(jiǎn)單的操作,你可以將它是做Fragment,重寫onCreateView,也可以重寫onCreateDialog。根據(jù)onCreateDialog的注釋來看,結(jié)合Fragment的生命周期,這幾個(gè)回調(diào)函數(shù)的調(diào)用順序是:
onCreate -> onCreateDialog -> onCreateView,如果使用onCreateDialog創(chuàng)建UI,就沒必要使用onCreateView。

onCreateDialog會(huì)調(diào)用Dialog的構(gòu)造函數(shù),然后會(huì)創(chuàng)建Window。
使用onCreateDialogView什么時(shí)候被加入Window中?
如果我們使用onCreateDialog,那我們的View什么時(shí)候會(huì)被加入window呢?

假設(shè)我們直接用onCreateDialog,跳過onCreateView,后續(xù)的生命周期會(huì)走到onActivityCreated,這里會(huì)調(diào)用Dialog#setContentView,將View放到Dialog專屬的Window中:
PS: AlertDialog.Builder#setView其實(shí)只是將View存起來了而已:
總結(jié)一下,所以不管使用onCreateView還是onCreateDialog都會(huì)將加載的View放到window中,大家不需要擔(dān)心~
DialogFragment#show
Dialog和Fragment并不是個(gè)人自掃門前雪的狀態(tài),兩個(gè)各自有生命周期的組件DialogFragment都將兩者的生命周期考慮了:
乍一看,這里面怎么沒有調(diào)用Dialog#show,但是Dialog和Fragment肯定共用一個(gè)Window,
只要DialogFragment能被顯示出來,UI肯定可以顯示。
DialogFragment#dismiss
dismiss的話就很清楚了,首先要移除掉dialog,并且使用Transaction移除Fragment