美文网首页
同一个Activity托管的两个Fragment之间的数据交互

同一个Activity托管的两个Fragment之间的数据交互

作者: 爱做梦的严重精神病患者 | 来源:发表于2019-03-04 15:58 被阅读0次
    activity托管.png

      CrimeListActivity托管着CrimeListFragment,如今要将CrimeFragment添加给CrimeListActivity。

      有一个解决方案:首先获取CrimeListActivityFragmentManager,然后提交一个fragment事务,将CrimeFragment添加到布局的容器中

    class CrimeListFragment {
         Fragment fragment = CrimeFragment.newInstance(id);
         FragmentManager fm = getActivity().getSupportFragmentManager();
         fm.beginTransaction()
             .add(R.id.detail_fragment_container,fragment)
             .commit();
    }
    

      虽然行得通,但是fragment天生是独立的开发构件。如果要开发fragment用来添加其他fragment到activity的FragmentManager,那么这个fragment就必须知道托管activity是如何工作的。结果该fragment无法再作为独立的开发构件使用了。
      以上述代码为例,CrimeListFragment将CrimeFragment添加给了CrimeListActivity,并且认为CrimeListActivity的布局里包含detail_fragment_container。实际上CrimeListFragment根本就不关心这些,这都是托管activity应该处理的事。

    1.定义fragment回调接口

      要委托工作任务给托管activity,通常的做法是由fragment定义回调接口。接口定义了fragment委托给activity处理的工作任务,任何打算托管目标的activity都必须实现它

    class CrimeListFramgent {
    private Callbacks mCallbacks;
    
    public interface Callbacks {
          void onCrimeSelected(Crime crime);
          }
    }
    
    class CrimeListActivity implements CrimeListFragment.Callbacks {
    @Override
    public void onCrimeSelected(Crime crime)
          Fragment newDetail = CrimeFragment.newInstance(id);
    
          getSupportFragmentManager().beginTransaction()
                  .replace(R.id.detail_fragment_container,newDetail)
                  .commit();
    }
    

    2.调用回调接口

      当CrimeListFragment被添加给CrimeListActivity时,系统会调用Fragment.onAttach(Context)方法。利用此方法传递进来的参数,获取实现了回调接口的activity实例,并保存以便在需要时回调,为CrimeListActivity添加另一个fragment

    class CrimeListFramgent {
    //该方法在fragment附加给activity时调用
    @Override
    public void onAttach(Context context) {
              super.onAttach(context);
              //  将传进来的context转化为callback
              mCallbacks = (Callbacks) context;
              }
    
    @Override
    public void onDetach() {
            super.onDetach();
            mCallbacks = null;
            }
    
    ...
    mCallbacks.onCrimeSelected(crime);
    }
    

    相关文章

      网友评论

          本文标题:同一个Activity托管的两个Fragment之间的数据交互

          本文链接:https://www.haomeiwen.com/subject/goxiuqtx.html