当前位置:  开发笔记 > Android > 正文

在相同片段的不同实例之间进行通信

如何解决《在相同片段的不同实例之间进行通信》经验,为你挑选了2个好方法。

问题如下.让我们有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.这是因为它们的组合NavigationDrawerViewPager提到的Tabs和Tabs有关.



1> Konstantin L..:

我建议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());

(并避免在第二个选项卡中处理事件 - 只需在片段实例化期间传递额外参数,如果必须侦听事件)



2> Thomas R...:

片段是否在一个活动中托管?然后,您可以在托管活动上实现一个界面.

YourActivity implements MyInterface {
...
}

在你的片段中你定义了这个:

@Override
public void onAttach(final Activity context) {
  myInterface = (MyInterface) context;
}

当你单击片段中的某些内容然后调用myInterface.doSomething(parameter);.然后您的活动可以委托给另一个片段.

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有