activity 点击后传递数据给fragment_如何用更好的方式在 Activity 或 Fragment 之间传递以及返回数据?...

93ff59aa9a1f633ec664b30ba21f4ca3.png

前言

我们都知道在Activity之间传递数据很繁琐,为了简化,很多人都是使用过EventBus,可EventBus在追踪问题时反而束手无策,反而增加调试时间,那我们能不能找一个折中的方案,又能简单的实现,又能容易追查问题呢?

下面请允许我介绍一下最新的方式在实现数据的Result

一、先来看看以前我们都是如何做的

override 

以前,我们都是这样处理Result,分别定义不同的RequestCode,然后根据这个值来匹配数据。我们再来看看新的方式,然后做个比较

二、Activity Result新方式

step one:加入依赖

implementation 

step two:编码

class 

继承ActivityResultContract,并覆写createIntent和parseResult函数,这俩函数很好理解,一个负责创建Intent,一个负责解析Result,那接下来如何使用呢?

class 

只需要调用registerForActivityResult函数,然后在点击事件中,用其返回值调用launch函数即可

class 

代码运行效果

3bf4c05dbf9a1db1e2583b7b618d1946.png

这么实现有什么优点呢?

  • 一方面针对ResultActivity的启动传参数,更加的具体,启动该Activity,不必要关心postId的key是什么,这样在其他页面需要调用的时候,也只是传入参数,这样对于以后key的重构就不会影响其他部分
  • 另一方面不再需要定义RequestCode,也不错哦
  • 其实它还有个优势哦,看过源码才知道,其实它是结合了lifecycle,在页面销毁的时候,会自动将生成的RequestCode给remove掉

Fragment Result新方式

一张图看清整个通讯的过程

e859cdb3134179f9a106111bd9906e1d.png
Fragment B 使用 FragmentManager 将数据发送到 Fragment A

在生成结果的 Fragment B 中,必须使用相同的 requestKey 在同一 FragmentManager 上设置结果。您可以使用 setFragmentResult() API 来完成此操作:

button

在Fragment A中注册回调结果监听

FragmentManager

这种情况需要注意的就是requestKey,在出去和返回的时候都要保持一致。还有一种情况是,如果有多个数据传递,只会接收到最新的值,更Activity一样,在DESTROYED时,会自动取消listener,以上是同级Fragment的传递,如果是父子级呢?

c7dde57b00fd9f09200bb5f5e81b57e7.png

如图所示,需要在Parent Fragment 调用 childFragmentManager来注册listener

override 

这么实现有什么优点呢?

  • 完全解耦,无需依赖对方
  • 当ON_DESTROY时自动注销
文章和往期干货已被收录至专栏【 进击的Android秃头】, 喜欢的或者 觉得我写的还行的朋友 可以点一波双关(关注作者+关注专栏)哟。

作者: @程序写到秃

专栏:“下方卡片”【进击的Android秃头

进击的Android秃头​zhuanlan.zhihu.com
d5c46162c0d70a0b484bdc1eecf9131c.png

d07a8636cf350bf950f8a4593016b498.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值