问题如下。让我们有3个带片段的标签:
如您所见,标签3和标签2包含相同的片段但不同的实例。
如何将数据(不是通过参数)发送到确切的标签2?
我尝试过的事情:
Local Broadcast Receiver
onReceive()
检查接收的ID是否等于片段的ID 但不幸的是,广播只被发送到了Tab 3。
编辑:更多信息。
这些标签位于另一个ViewPager
的片段中。这是由于NavigationDrawer
与ViewPager
的片段和提到的Tabs的组合。
答案 0 :(得分:6)
我建议在您的应用中引入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());
(并避免在第二个标签中处理事件 - 只要在片段实例化时传递额外的参数,如果它必须监听事件)
答案 1 :(得分:5)
片段是否在一个活动中托管?然后,您可以在托管活动上实现一个界面。
YourActivity implements MyInterface {
...
}
在你的片段中你定义了这个:
@Override
public void onAttach(final Activity context) {
myInterface = (MyInterface) context;
}
当您点击片段中的内容时,请拨打myInterface.doSomething(parameter);
。然后您的活动可以委托给另一个片段。
答案 2 :(得分:0)
您没有写过如何在运行时添加片段。最好在运行时添加它并将TAG分配给每个片段,如下所示:
...
fragmentTransaction.replace(R.id.layoutTab2, fragment, "F-B-2");
...
fragmentTransaction.replace(R.id.layoutTab3, fragment, "F-B-3");
...
以后您可以通过其标记识别或查找片段。例如:
FragmentManager.findFragmentByTag("F-B-2")
或者如果你需要片段B 3:
FragmentManager.findFragmentByTag("F-B-3")
希望它会有所帮助。
答案 3 :(得分:0)
您可以使用Bundle的思想在Fragments之间传递数据。我可以看到我在之前的帖子中对这个想法的建议被误解了。 以下是片段接收数据的示例代码。的 Fragment2 强>:
public static Fragment2 newInstance(long param1, String param2) {
MediaFragment fragment = new Fragment2();
Bundle args = new Bundle();
args.putLong(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
Bundle bundle = getArguments();
audioId = bundle.getLong(ARG_PARAM1);
audioName = bundle.getString(ARG_PARAM2);
}
}
在另一个片段或活动上,调用 Fragment2 :
Fragment2 recvfragment = Fragment2.newInstance(itemId, itemName);
注意:
Fragment2
。答案 4 :(得分:0)
如果从Fragment A移动到Fragment B,只需将值传递给片段B的构造函数。
否则,如果您需要在所有三个片段中使用相同的数据集,您也可以使用共享首选项。