同一个Activity托管的两个Fragment之间的数据交互
2019-03-04 本文已影响0人
爱做梦的严重精神病患者
activity托管.png
CrimeListActivity托管着CrimeListFragment,如今要将CrimeFragment添加给CrimeListActivity。
有一个解决方案:首先获取CrimeListActivity的FragmentManager,然后提交一个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);
}