Android应用开发中Fragment间通信的实现教程

2019-12-10 19:01:54于海丽


实现接口

为了接收从fragment传递过来的事件回调,宿主Activity必须实现定义在fragment类中的接口。

例如,下面的activity实现了上个例子中的接口。

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener{
  ...
  
  public void onArticleSelected(int position) {
    // 用户选择了HeadlinesFragment中的头标题后
    // 做一些业务操作
  }
}

将消息传递给fragment

宿主Activity可以通过调用findFragmentById()方法获取Fragment实例,然后直接调用Fragment的公有方法,将消息传递给Fragment。

例如,想象一下,之前讲过的Activity可能包含有其他的fragment,而这些fragment通过上面的回调函数返回的接口动态地显示一些内容。这种情况下,Activity可以将回调函数中接收到信息传递给需要的fragment。

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener{
  ...

  public void onArticleSelected(int position) {
    // 用户选中HeadlinesFragment中的头标题后
    // 做一些必要的业务操作

    ArticleFragment articleFrag = (ArticleFragment)
        getSupportFragmentManager().findFragmentById(R.id.article_fragment);

    if (articleFrag != null) {
      // 如果 article frag 不为空,那么我们在同时显示两个fragmnet的布局中...

      // 调用ArticleFragment中的方法去更新它的内容
      articleFrag.updateArticleView(position);
    } else {
      // 否则,我们就是在仅包含一个fragment的布局中并需要交换fragment...

      // 创建fragment并给他一个跟选中的文章有关的参数
      ArticleFragment newFragment = new ArticleFragment();
      Bundle args = new Bundle();
      args.putInt(ArticleFragment.ARG_POSITION, position);
      newFragment.setArguments(args);
    
      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

      // 用这个fragment替换任何在fragment_container中的东西
      // 并添加事务到back stack中以便用户可以回退到之前的状态
      transaction.replace(R.id.fragment_container, newFragment);
      transaction.addToBackStack(null);

      // 提交事务
      transaction.commit();
    }
  }
}