首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >片段互通

片段互通
EN

Stack Overflow用户
提问于 2012-04-02 22:27:23
回答 2查看 1.1K关注 0票数 1

我使用ActionBar实现了三个选项卡。片段是以编程方式编码的。

我想设置listener on Fragment2 (Tab2),这样当Fragment1通过回调(自定义listener)发送一些数据时,Fragment2会更新它的内容字段。

我想不出办法,希望能帮上忙。

EN

回答 2

Stack Overflow用户

发布于 2012-04-02 22:53:00

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

我建议避免直接在片段之间发送消息,因为活动知道哪些片段正在使用中。

票数 2
EN

Stack Overflow用户

发布于 2012-04-02 22:57:58

这里有几个选项。

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

代码语言:javascript
复制
private MyListener mListener

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

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

代码语言:javascript
复制
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线程中操作(您确实希望它不在UI线程中操作),因此如果您要进行任何UI操作,请在Handler中进行,否则将获得异常

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9978245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档