在同一片段

时间:2015-12-10 10:40:05

标签: android android-fragments tabs broadcastreceiver android-broadcast

问题如下。让我们有3个带片段的标签:

  • 表1(片段A)。需要将数据发送到标签2。
  • 表2(片段B)。需要从表1中接收数据。
  • 表3(片段B)。已经包含数据。

如您所见,标签3和标签2包含相同的片段但不同的实例。

如何将数据(不是通过参数)发送到确切的标签2?

我尝试过的事情:

  1. 创建片段B时,通过参数设置片段B的唯一ID。
  2. 为Fragment B的两个实例注册相同的Local Broadcast Receiver
  3. 使用ID
  4. 将数据从片段A发送到片段B.
  5. 在片段B中onReceive()检查接收的ID是否等于片段的ID
  6. 但不幸的是,广播只被发送到了Tab 3。

    编辑:更多信息。

    这些标签位于另一个ViewPager的片段中。这是由于NavigationDrawerViewPager的片段和提到的Tabs的组合。

5 个答案:

答案 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);

注意:

  • 使用Bundles,您可以将具有值的特定数据类型传递到您需要的Fragment的不同实例中。
  • 在这种情况下,代码将Long和String类型传递到Fragment2

答案 4 :(得分:0)

如果从Fragment A移动到Fragment B,只需将值传递给片段B的构造函数。

否则,如果您需要在所有三个片段中使用相同的数据集,您也可以使用共享首选项。