0

我找到了很多关于片段和它的 Activity 之间通信的答案,但它总是描述片段和它自己的 Activity 之间的通信。我找不到如何在不同活动中的片段之间进行通信的描述。

我有以下情况: 我有 ItemsActivity 包含 ItemsFragment 和项目列表。用户滚动浏览项目并单击某个项目。然后 ItemsFragment 创建一个新 Activity 的实例: DetailActivity 包含 DetailFragment ,其中实现了项目的详细视图。用户修改项目的数据并单击返回(或某些保存按钮)。修改项的数据被保存,DetailActivity 被销毁并从回栈中移除。用户返回到包含项目列表的 ItemsActivity/ItemsFragment。

问题: DetailFragment 应该通知 ItemsFragment,该项目已被修改,因此 ItemsFragment 应该更新它在项目列表中的视图。问题是DetailFragment对不同Activity(ItemsActivity)中的ItemsFragment一无所知。如何从 DetailFragment 通知 ItemsActivity 中的 ItemsFragment,该项目已更改并且应更新列表中的项目视图?

4

2 回答 2

1

感谢 Software Sainath 的评论,我通过使用LocalBroadcastManager解决了两个片段之间的通信。它在这里描述。使用 LocalBroadcastManager 的一个非常有用的示例在这里

于 2013-10-12T17:34:32.160 回答
-1

我从这个答案中窃取了这段代码:将数据发送回 android 中的主活动

使用 startActivityForResult() 从 ItemsActivity 启动 DetailsActivity。

在 DetailsActivity 中设置结果以发回任何适当的信息。由于您似乎正在将所有信息保存到磁盘,这可能只是一种识别需要从磁盘读取和更新哪些项目的方法,或者您可以将更新项目所需的所有信息传回。使用 resultIntent.putExtra() 将您想要发回的信息附加到 ItemsActivity。

当您保存了新数据并希望项目返回到 ItemsActivity 并更新项目时,请执行此操作:

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
setResult(ItemsActivity.RESULT_CHANGED, resultIntent);
finish();

覆盖 ItemsActivity 中的 onActivityResult() 方法。在下文中,“requestCode”将是放入 startActivityForResult() 以标识请求内容的整数。“resultCode”是您放入 setResult() 的内容。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == ItemsActivity.RESULT_CHANGED) {
        // TODO Extract the data returned from the DetailsActivity and update item 
      }
      break;
    } 
  }
}

此代码假定您在 ItemsActivity 中定义了一个常量 RESULT_CHANGED。“requestCode”是传递给 startActivityForResult() 的 int,用于识别结果的来源。

于 2013-10-11T21:14:13.533 回答