Fragment 与Fragment之间的通信
来源:互联网 发布:日本二战殖民地知乎 编辑:程序博客网 时间:2024/04/28 21:18
1、背景
如图,在图片中,要实现ListFragment中点击的不同,就要实现对DetailFragment的更新,在DetailFragment中的内容出现变化时,ListFragment也要做相应的变化,那么如何,实现DetailFragment与ListFragment之间的通信呢?
2、实现方式
为了保持Fragment的独立性,我们可以在Fragment中定义回调接口,委托托管的Activity来完成那些不应该由Fragment处理的任务,托管activity将实现回调接口,履行托管Fragment的任务
1、在ListFragment中定义了一个内部接口,
public class CrimeListFragment extends ListFragment { private Callbacks mCallbacks; public interface Callbacks{ void onCrimeSelected(Crime crime); }@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);mCallbacks=(Callbacks) activity;}@Overridepublic void onDetach() {// TODO Auto-generated method stubsuper.onDetach();mCallbacks=null;}2、同时在托管的Activty中实现这个接口,并重写了接口中的onCrimeSelected(Crime crime)方法,该方法主要用于当点击ListFragment中的item时,更新DetailFragment,
public class CrimeListActivity extends SingleFragmentActivity implements CrimeListFragment.Callbacks{@Overridepublic void onCrimeSelected(Crime crime) {FragmentManager fm=getSupportFragmentManager();FragmentTransaction ft=fm.beginTransaction();Fragment oldDetail=fm.findFragmentById(R.id.detailFragmentContainer);Fragment newDetial=CrimeFragment.newInstance(crime.getId());if(oldDetail!=null){ft.remove(oldDetail);}ft.add(R.id.detailFragmentContainer, newDetial);ft.commit();}}}3、那么如何在ListFragment中实现呢?首先在ListFragment被托管在Activity时,实例化mCallback对象,当Fragment被托管的Activity移除时,设置mCallback对象为空,因为ListFragment不被托管时,更新界面是不起作用的。同时当点击ListFragment中的数据时,调用mCallback.onCrimeSelected()方法
<pre name="code" class="java">public class CrimeListFragment extends ListFragment { public void onListItemClick(ListView l, View v, int position, long id) { // get the Crime from the adapter Crime c = ((CrimeAdapter)getListAdapter()).getItem(position); // start an instance of CrimePagerActivity // Intent i = new Intent(getActivity(), CrimePagerActivity.class); // i.putExtra(CrimeFragment.EXTRA_CRIME_ID, c.getId()); // startActivityForResult(i, 0); mCallbacks.onCrimeSelected(c); public interface Callbacks{ void onCrimeSelected(Crime crime); } public void UpdateUI(){ ((CrimeAdapter)getListAdapter()).notifyDataSetChanged(); }@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);mCallbacks=(Callbacks) activity;}@Overridepublic void onDetach() {// TODO Auto-generated method stubsuper.onDetach();mCallbacks=null;}}mCallback对象其实还是一个Activity对象,所以在此方法中调用的onCrimeSelected()方法就是activity中被重写的onCrimeSelected()方法,那么ListFragment更新Detail界面的流程就是这样。同理,在DetailFragment中更新ListFragment中的数据,只需要在DetailFragment中声明一个接口,同时在Activity中实现,在实现的过程中调用ListFragment中的 UpdateUI方法,就可以实现DetailFragment中的数据变化后ListFragment中的界面也会相应的进行改变,具体代码如下:
public class CrimeFragment extends Fragment { /** * * @author user * Required interface for hosting activites. */ public interface CallBacks{ void onCrimeUpdated(Crime crime); } @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); mCallbacks=(CallBacks) activity; } @Override public void onDetach() { // TODO Auto-generated method stub super.onDetach(); mCallbacks=null; } {
在Activity中重写DetailFragment中的方法
public class CrimeListActivity extends SingleFragmentActivity implements CrimeListFragment.Callbacks,CrimeFragment.CallBacks {@Overridepublic void onCrimeUpdated(Crime crime) {// TODO Auto-generated method stubFragmentManager fm=getSupportFragmentManager();CrimeListFragment listFragment=(CrimeListFragment) fm.findFragmentById(R.id.fragmentContainer);listFragment.UpdateUI();} }
0 0
- Fragment与Fragment之间的通信
- Fragment 与Fragment之间的通信
- Fragment与Fragment之间的通信
- Fragment与Fragment之间的通信
- Activity与Fragment,Fragment与Fragment之间的通信
- Fragment之间的通信
- Fragment之间的通信
- Fragment之间的通信
- Fragment之间的通信
- Fragment 之间的通信
- Fragment之间的通信
- Fragment之间的通信
- Fragment之间的通信
- Fragment之间的通信
- Fragment之间的通信
- Fragment之间的通信
- Fragment之间的通信
- Fragment与Activity之间的通信
- C语言保留字
- 高压力, 多CPU, 高内存环境下JVM设置
- 字坐祖做灼注桌琢祝遵醉揍踪谆缀组浊昨
- Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion' 解决方案
- GreenDao简明教程(查询,Querying)
- Fragment 与Fragment之间的通信
- 装佐柞做谞转揍谞拽滋坐准专最罪祖咨阻
- 准籽状滓赚子柞坠滓阻谞祝祖柞着子专兹
- eclipse与Hadoop集群连接
- 关于TPM和PWM模式
- 最近在思考该如何搭建一个框架便于自己的开发。
- Java保留字
- 个推使用总结
- 抓组字滓咨拙赚遵阻姿姿组滋准滋淄孜椎