碎片互通

时间:2012-04-02 14:27:23

标签: java android

我使用ActionBar实现了三个Tabs。 片段以编程方式编码。

我想在Fragment2(Tab2)上设置监听器,以便当Fragment1通过回调(Custom listener)发送一些数据时,Fragment2会更新其内容字段。

我无法找到办法,希望得到帮助。

2 个答案:

答案 0 :(得分:2)

最好的方法可能是通过活动来完成。因此,当片段处理事件时,它会通知Activity,然后Activity决定如何处理它,并将其传递给其他片段之一。

我建议避免在Fragments之间直接发送消息,因为Activity知道当前正在使用的内容。

答案 1 :(得分:2)

你有几个选择。

让您的包含活动管理所执行的操作 - 让活动实现您的片段定义的回调接口,并将您的活动转换为onAttach()中的回调:

private MyListener mListener

public void onAttach(Activity activity) {
  try {
    mListener = (MyListener) activity;
  }
  catch (ClassCastException e) {
    throw new IllegalArgumentException("Calling activity must implement MyListener");
  }
}

或者,您可以注册BroadcastReceiver来处理第一个片段的意图广播:

public class MyFragment1 extends Fragment {

  public static final String ACTION_UPDATE = "com.example.MyFragment.update"

  public void updateOther() {
    Intent i = new Intent(ACTION_UPDATE);
    getActivity().sendBroadcast(i);
  }
  ...
}

public class MyFragment2 extends Fragment {
  private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      if (intent.getAction().equals(MyFragment1.ACTION_UPDATE)) {
        // Do stuff
      }
    }
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    IntentFilter if = new IntentFilter(MyFragment1.ACTION_UPDATE);
    getActivity().registerReceiver(mReceiver, if);
  }

  @Override
  public void onDestroy() {
    getActivity().unregisterReceiver(mReceiver);
  }
}

请记住,您的onReceive调用可能会在UI线程中运行,也可能不运行(并且您确实不会这样做),因此如果您执行任何UI操作,请在Handler或你会得到一个例外