Fragment的创建和传参到底应该怎么写

之前一直写的都是一些干货,没有怎么和大家聊过我自己关于技巧和理解上的一系列问题,这段时间准备聊一聊关于自己理解上的一系列问题,也希望大家一起探讨。各抒己见。

今天想和大家谈谈Fragment到底该如何编写这样的一个问题,为什么会谈到这样的一个问题?其实还是跟了google的风。去年google io大会中,Google向大家推荐了官方的一系列Android开发辅助工具,其中的有几个(例如:ViewModel可以在attach在同一个Activity中的多fragment之前共享数据,Navigation直接就建议开发者开发出单Activity多fragment的应用)直接或间接的说明了google现在对于单Activity应用的推荐和重视。

那么既然Google都这么推荐,那么单Activity多fragment的应用优势在什么地方呢?

首先,单activity多fragment的开发方式可以让开发者更加简便的在多个页面(即Fragment中)传递数据。由于Activity在Android中的定义和特性,导致Activity本身就是一个可被系统回收的控件,存在跨进程的可能,且回收时机不固定。也正是由于这个原因。系统并未开放Activity跳转时让开发者获取到将要跳转到的activity的功能。activity的出入栈,都是由系统控制,开发者能难通过正常的途径向即将跳转到的activity传值。又因为可跨进程,所以官方提供了序列化工具类,帮助开发者传值。但是!!!!(凡事都有个但是,是吧~~)序列化与反序列化并不是那么好操作,使用java提供的序列化方法,性能令人着急。使用Google提供的方法,需要写一大堆代码,就算使用辅助插件生产,但是遇到继承时,还是得一脸懵逼的添加标示位来区别子类。这一直是android开发者心中的痛,对比IOS中的ViewController可以直接传值,真是蛋疼的一笔。

其次,若想实现左侧边缘滑动返回(类似IOSNavigationController)。比起Activity,Fragment的实现就简单明了的多,也符合Fragment的实现原理。

那么对于第一点来说,使用Fragment就可以直接负值了么?

并不是,很多新手开发者使用Fragment的时候肯定被Fragment整的莫名奇妙。本来准备写个构造函数直接把需要的值传进去。但是lint就一直弹提示。说Fragment需要一个无参构造函数。看了官方的说明,添加newInstance方法。系统又要我把传进来的数据序列化后放到Argment里面?什么鬼,直接负值给Fragment不就好了么?

上面这些是我之前犯的错误,相信大家也可能会遇到其中的一两个,那我们就来详细说明下,为什么Fragment需要无参构造函数。为什么不能直接给Fragment负值。

详细大家使用Fragment的时候都会使用到FragmentManager。其实官方设计Fragment有两个用途,第一,作为一个Little的activity使用,但是Fragment的管理,是开放给开发者的,但是开发者一样可以让系统托管Fragment的出入栈操作。即使用调用addToBackStack()将fragment添加进系统回退栈。还有一个用处就是充当viewController用来管理View,比如系统提供的DialogFragment 用来托管Dialog。

那么还是没有解释,为什么不能传参数啊?不要急,慢慢来看。

由于系统可以托管Fragment,那么系统对于Fragment的托管就类似于Activity。系统托管的Activity有一个什么样的特性呢?对,就是系统会在一定的时机回收Acitvity。并在用户返回的时候,尝试恢复Acitvity。对于系统托管的Fragment,系统其实也是这样做的。系统在后台的情况下,可能会回收Fragment,并在用户返回时尝试恢复。那这就解释了,系统为什么不让你直接传值和为什么要保留Fragment的无参构造函数了。因为系统在一定的时机情况下。会对Fragment进行回收。被回收的Fragent系统中只会保留一个Bundle来保存你需要保存的数据,即onSaveInstace中保存的数据。但是系统会保留Fragment中的Argument因为Argument也是可序列化的,而且这个参数的保存位置也是上问提到的Bundle中。在系统尝试恢复的时候,系统会重新实例化被销毁的那个Fragment(即这里是为什么需要无参构造)。并重新走生命周期。那么你就可以重新拿到Argument进行重新创建Fragment。但是系统是没办法拿到你负值传进来的数据的。所以系统不建议你这样使用。

说了这么多,那Fragment需要函数式接口的时候怎么办?函数式接口(如OnClickListener等)也可以通过序列化类继承实现。而且在官方的DialogFragment Demo中也提供了一个思路,即获取Attach到的Activity并通过调用Activity里面的方法完成调用。现在由于JetPack中提供ViewModle,那么你也可以将这些方法在ViewModel中实现。并在Fragment中调用ViewModel中的方法。

好了 今天就聊到这里,大家可以一起留言讨论。聊聊自己对Fragment创建自己的理解和看法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值