两个片段之间的通信,每个片段都有自己的Activity

时间:2013-10-11 20:45:22

标签: android android-fragments

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

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

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

2 个答案:

答案 0 :(得分:1)

感谢Software Sainath的评论,我使用 LocalBroadcastManager 解决了两个片段之间的通信问题。 它描述了here。 使用LocalBroadcastManager的一个非常有用的例子是here

答案 1 :(得分:-1)

我从这个答案中偷走了这段代码:Sending data back to the Main Activity in 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,用于标识结果的来源。