问题如下.让我们有3个带片段的标签:
表1(片段A).需要将数据发送到Tab 2.
表2(片段B).需要从Tab 1接收数据.
表3(片段B).已经包含数据.
如您所见,选项卡3和选项卡2包含相同的片段但不同的实例.
如何将数据(不是通过参数)发送到Tab 2?
我尝试过的:
片段B在创建时通过参数设置唯一ID.
Local Broadcast Receiver
对片段B的两个实例注册相同
使用其ID将数据从片段A发送到片段B.
在片段B中onReceive()
检查接收的ID是否等于片段的ID
但不幸的是,广播仅被发送到Tab 3.
编辑:更多信息.
这些选项卡托管在另一个片段中ViewPager
.这是因为它们的组合NavigationDrawer
与ViewPager
提到的Tabs和Tabs有关.
我建议EventBus
在你的应用程序中介绍.
添加依赖项 - 添加compile 'de.greenrobot:eventbus:2.4.0'
到依赖项列表中.
然后,您只需订阅第三个选项卡的片段以从第一个片段中侦听事件.
像这样:在片段B中
@Override public void onAttach(Activity activity) { super.onAttach(activity); eventBus.register(this); } @Override public void onDetach() { eventBus.unregister(this); super.onDetach(); } @SuppressWarnings("unused") // invoked by EventBus public void onEventMainThread(NewDataEvent event) { // Handle new data }
NewDataEvent.java
public class NewDataEvent extends EventBase { public NewDataEvent() {} }
在片段A中只发送事件:
protected EventBus eventBus; .... eventBus = EventBus.getDefault(); .... eventBus.post(new NewDataEvent());
(并避免在第二个选项卡中处理事件 - 只需在片段实例化期间传递额外参数,如果必须侦听事件)
片段是否在一个活动中托管?然后,您可以在托管活动上实现一个界面.
YourActivity implements MyInterface { ... }
在你的片段中你定义了这个:
@Override public void onAttach(final Activity context) { myInterface = (MyInterface) context; }
当你单击片段中的某些内容然后调用myInterface.doSomething(parameter);
.然后您的活动可以委托给另一个片段.