首页 > 解决方案 > 两个片段不应该直接通信

问题描述

我有活动 A 和 BA有片段AF,B有BF。

从 AF 我导航到片段 BF,如下所示:

Intent i = new Intent(getActivity(), B.class);
startActivityForResult(i, B.REQUEST_CODE);

从 B 活动中,我正在加载 BF 片段,如下所示:

BF bf = new BF();
bf.init(this);
getSupportFragmentManager().beginTransaction()
      .add(R.id.bfFragmentHolder,bf)
      .commitAllowingStateLoss();

完成 BF 片段中的工作后,我通过带有一些数据对象的接口将一些数据传递给 B 活动,然后返回到 A 活动的 AF 片段,如下所示:

Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();

之后,AF 片段onStart()被调用。

我的问题是如何将数据传递给 BF 到 AF 片段?我知道它建议不要直接交流。但是我怎样才能在那里发送数据?我应该使用 Intent 将数据传递给 A 活动,然后将其传递给 AF 片段吗?

标签: javaandroidandroid-fragments

解决方案


在您的情况下,考虑这一点的一种方法是使用管理整个应用程序状态的东西,因为您被迫有多个活动,但是您需要在它们之间建立某种通信方式,AppManager 会是解决此类问题的理想方法。

您将在您的应用启动时注入/启动 AppManager,并将其绑定到您的 Application 类,我想将它作为 Singleton 也是理想的。

但是,我也很想提及这一点,但是如果您可以将 Activity A 和 Activity B 组合成一个容器 Activity,并使用 Navigation Component 使 Fragment AF 和 BF 转换,那么就有一个跨容器的共享视图模型活动,片段 AF 和 BF,这将是一种更好的方式,但我知道您可能会受到限制或紧张于遗留代码。

最后一件事,这可能是个人意见,但是让 EventBus 处理此类数据转换,将违反您的应用程序中设置的所有架构规则或法律,您实际上强制覆盖任何自上而下的方法来处理数据就像在应用程序的任何地方发布一个正在监听的事件一样简单,不像 ViewModel 那样总是有一个被绑定的范围。

希望这可以解决您的问题!


推荐阅读