欢迎光临散文网 会员登陆 & 注册

DevLog 11.1 LocalDate & DialogFragment

2021-11-03 17:03 作者:房顶上的铝皮水塔  | 我要投稿

参考内容:


1. Java 8新特性(四):新的时间和日期API: https://lw900925.github.io/java/java8-newtime-api.html



使用LocalDate而不是Calendar、SimpleDateFormat 

使用SimpleDateFormat可能会出现以下问题:

  1. 构建SimpleDateFormat的开销大

  2.  SimpleDateFormat.format parse是线程不安全

LocalDate 的简单使用:


其中with接受一个TemporalAdjuster函数接口,其中接受一个Temporal参数,它是LocalDate的父类。API中给出的其他的TemporalAdjuster的相关实现有:

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

DialogFragment

DialogFragment = Dialog + Fragment

Dialog具有自己的window,会自行处理点击事件,并且会自行决定什么时候disappear。

Dialog中Window创建的时机

Dialog的生命周期

onCreate show onStart cancel onDismiss Stop

AlertDialog#show 的执行流程:


AlertDialog#create:

所以,AlertDialog#create这一步实质上是将window进行初始化,但是View并没有添加到window中(View添加到Window中的标志应该是调用WindowManager#addView)。

Dialog#show

从图上我们可以看到Dialog的onCreate的调用是在show方法中,并且是在show中将传入的View参数添加到了Window中,我们简要的看看代码:

最后调用了一个sendShowMessage方法,这个方法会关联到这个Handler的实现类:

这三个回调接口都是定义在Dialog相关的顶级父类DialogInterface中的,因此我们可以通过设置回调函数监听Dialog的一些行为:

DialogFragment

好像绕的有点远,那我们回到我们的正题DialogFragment。

其实DialogFragment就是Fragment,只不过其中有一个Dialog的实例。DialogFragment给我了更为简单的操作,你可以将它是做Fragment,重写onCreateView,也可以重写onCreateDialog。根据onCreateDialog的注释来看,结合Fragment的生命周期,这几个回调函数的调用顺序是:

onCreate -> onCreateDialog -> onCreateView,如果使用onCreateDialog创建UI,就没必要使用onCreateView。

onCreateDialog会调用Dialog的构造函数,然后会创建Window。


使用onCreateDialogView什么时候被加入Window中?

如果我们使用onCreateDialog,那我们的View什么时候会被加入window呢?


假设我们直接用onCreateDialog,跳过onCreateView,后续的生命周期会走到onActivityCreated,这里会调用Dialog#setContentView,将View放到Dialog专属的Window中:

PS: AlertDialog.Builder#setView其实只是将View存起来了而已:

总结一下,所以不管使用onCreateView还是onCreateDialog都会将加载的View放到window中,大家不需要担心~


DialogFragment#show

Dialog和Fragment并不是个人自扫门前雪的状态,两个各自有生命周期的组件DialogFragment都将两者的生命周期考虑了:

乍一看,这里面怎么没有调用Dialog#show,但是Dialog和Fragment肯定共用一个Window,

只要DialogFragment能被显示出来,UI肯定可以显示。


DialogFragment#dismiss

dismiss的话就很清楚了,首先要移除掉dialog,并且使用Transaction移除Fragment



DevLog 11.1 LocalDate & DialogFragment的评论 (共 条)

分享到微博请遵守国家法律