2013-10-11 89 views
0

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

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

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

+2

您可能应该将数据存储在某个可轻松访问的地方,就像数据库一样,您只需在您的onResume活动中再次拉动即可 – tyczj

+0

您可以简单注册BroadcastReceiver并将接收器调用到ItemsFragment –

+0

谢谢!我将学习BrodcastReceiver的用法。 – Fipil

回答

1

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

-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,用于确定结果来自哪里。

+0

谢谢你的回答,但这种方法真的对吗?我认为应该使用结果的开始活动,以便在调用活动确实期望得到任何结果时,例如启动相机意图制作图片等。但是在我的情况下,这不是太规范? – Fipil

+0

startActivityForResult()用于当您想要从您开始的活动获取反馈时使用。这可能是更复杂的东西,但从我可以告诉它经常用来取回字符串或布尔值。如果你很快从磁盘读取数据并生成列表,最简单的方法可能就是在onStart()中填充列表。 – Immanuel

+0

是的,但它对所描述的场景太过束缚。结果仅返回给调用活动。但是,如果DetailFragment是由于不同用户的行为而在另一个活动中创建的。无论如何,应该通知ItemsActivity,即使它不是变更的发起者。所以我认为更好的解决方案是使用BroadcastReceiver。看我自己的回答我自己的问题。 – Fipil