publicclassFragment1extendsFragment{finalStringTAG="testFragment1";
publicFragment1(){//Requiredemptypublicconstructor}
@OverridepublicvoidonAttach(Contextcontext){super.onAttach(context);Log.d(TAG,"onAttach");}
@OverridepublicvoidonCreate(@NullableBundlesavedInstanceState){super.onCreate(savedInstanceState);Log.d(TAG,"onCreate");}
@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Viewview=inflater.inflate(R.layout.fragment1_layout,null);Log.d(TAG,"onCreateView");returnview;}
@OverridepublicvoidonActivityCreated(@NullableBundlesavedInstanceState){super.onActivityCreated(savedInstanceState);Log.d(TAG,"onActivityCreated");}
@OverridepublicvoidonStart(){super.onStart();Log.d(TAG,"onStart");}
@OverridepublicvoidonResume(){super.onResume();Log.d(TAG,"onResume");}
@OverridepublicvoidonPause(){super.onPause();Log.d(TAG,"onPause");}
@OverridepublicvoidonStop(){super.onStop();Log.d(TAG,"onStop");}
@OverridepublicvoidonDestroyView(){super.onDestroyView();Log.d(TAG,"onDestroyView");}
@OverridepublicvoidonDestroy(){super.onDestroy();Log.d(TAG,"onDestroy");}
@OverridepublicvoidonDetach(){super.onDetach();Log.d(TAG,"onDetach");}}
1-2fragment1_layout.xml
publicclassFragment2extendsFragment{finalStringTAG="testFragment2";
publicFragment2(){//Requiredemptypublicconstructor}
@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Viewview=inflater.inflate(R.layout.fragment2_layout,null);Log.d(TAG,"onCreateView");returnview;}
@OverridepublicvoidonDetach(){super.onDetach();Log.d(TAG,"onDetach");}}2-2fragment2_layout.xml
publicclassFragment3extendsFragment{finalStringTAG="testFragment3";
publicFragment3(){//Requiredemptypublicconstructor}
@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Viewview=inflater.inflate(R.layout.fragment3_layout,null);Log.d(TAG,"onCreateView");returnview;}
@OverridepublicvoidonDetach(){super.onDetach();Log.d(TAG,"onDetach");}}3-2fragment3_layout.xml
publicclassMainActivityextendsActivity{finalStringTAG="testMainActivity";
TextViewmFragment1Tv;TextViewmFragment2Tv;TextViewmFragment3Tv;
FrameLayoutmainll;
FragmentManagermanager;FragmentTransactiontransaction;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);this.setContentView(R.layout.activity_main);
initView();initListener();initData();
Log.d(TAG,"onCreate");}
privatevoidinitListener(){mFragment1Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Fragment1fragment1=newFragment1();transaction=manager.beginTransaction();transaction.add(R.id.main_ll,fragment1,"1");transaction.commit();}});mFragment2Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Fragment2fragment2=newFragment2();transaction=manager.beginTransaction();transaction.add(R.id.main_ll,fragment2,"2");transaction.commit();}});mFragment3Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Fragment3fragment3=newFragment3();transaction=manager.beginTransaction();transaction.add(R.id.main_ll,fragment3,"3");transaction.commit();}});}
privatevoidinitData(){manager=getFragmentManager();}
privatevoidinitView(){mFragment1Tv=(TextView)findViewById(R.id.fragment1_tv);mFragment2Tv=(TextView)findViewById(R.id.fragment2_tv);mFragment3Tv=(TextView)findViewById(R.id.fragment3_tv);mainll=(FrameLayout)findViewById(R.id.main_ll);
}
@OverrideprotectedvoidonStart(){super.onStart();Log.d(TAG,"onCreate");}
@OverrideprotectedvoidonRestart(){super.onRestart();Log.d(TAG,"onRestart");}
@OverrideprotectedvoidonResume(){super.onResume();Log.d(TAG,"onResume");}
@OverrideprotectedvoidonPause(){super.onPause();Log.d(TAG,"onPause");
@OverrideprotectedvoidonStop(){super.onStop();Log.d(TAG,"onStop");}
@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(TAG,"onDestroy");}}4-2activity_main.xml
界面如下:
2.点击Fragment1,log如下:
3点击fragment2log如下:(这里并没有触发fragment1的生命周期)
5在此时分为两次不同的操作:
5-1测试返回操作:点击返回键,此时应用已经退出。log如下:
5-2home键测试操作:(1)点击home键,app退到后台,log如下:
(2)点击应用图标重新打开app,log如下:
6回退栈测试再回到5-1,如果想要点击返回键回到上一个Fragment的话,那么就需要加入到会退栈。修改MainActivity的方法initListener如下:
privatevoidinitListener(){mFragment1Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Fragment1fragment1=newFragment1();transaction=manager.beginTransaction();transaction.add(R.id.main_ll,fragment1,"1");transaction.addToBackStack(null);transaction.commit();}});mFragment2Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Fragment2fragment2=newFragment2();transaction=manager.beginTransaction();transaction.add(R.id.main_ll,fragment2,"2");transaction.addToBackStack(null);transaction.commit();}});mFragment3Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Fragment3fragment3=newFragment3();transaction=manager.beginTransaction();transaction.add(R.id.main_ll,fragment3,"3");transaction.addToBackStack(null);transaction.commit();
}});}操作:执行1.打开app,2.点击Fragment,3.点击Fragment2,4.点击Fragment3。此时清空LogCat,再点击返回键Log如下:
此时界面回到Fragment2,而其他Fragment和Activity的生命周期是没有变化的。若再点击返回键将回到Fragment1界面,再点击返回键就是回到Activity界面了。
(二)replace方法分析修改MainActivity的方法initListener如下:(主要是替换add为replace)
privatevoidinitListener(){mFragment1Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Fragment1fragment1=newFragment1();transaction=manager.beginTransaction();transaction.replace(R.id.main_ll,fragment1,"1");//transaction.add(R.id.main_ll,fragment1,"1");//transaction.addToBackStack(null);transaction.commit();}});mFragment2Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Fragment2fragment2=newFragment2();transaction=manager.beginTransaction();transaction.replace(R.id.main_ll,fragment2,"2");//transaction.add(R.id.main_ll,fragment2,"2");//transaction.addToBackStack(null);transaction.commit();}});mFragment3Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Fragment3fragment3=newFragment3();transaction=manager.beginTransaction();transaction.replace(R.id.main_ll,fragment3,"3");//transaction.add(R.id.main_ll,fragment3,"3");//transaction.addToBackStack(null);transaction.commit();
}});}1.测试replace操作:启动app,然后点击Fragment1,再点击Fragment2,log如下:
2.测试返回键在上一步骤的基础上点击物理返回键Log如下:(应用程序已经退出了)
3.在(二)1的基础上点击home键,再重新打开app,log如下:
4.此时看下会退栈的情况。修改MainActivity的方法initListener,主要是取消
//transaction.addToBackStack(null);1的注释。
可见replace是会销毁掉被replace的Fragment。
(三)hide&show方法分析。修改MainActivity如下:(在activity的oncreate中addFragment1和Fragment2,修改mFragment2Tv的点击事件。)
publicclassMainActivityextendsActivity{finalStringTAG="testFragmentMainActivity";
Fragment1fragment1;Fragment2fragment2;Fragment3fragment3;
privatevoidinitListener(){mFragment1Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){
transaction=manager.beginTransaction();transaction.add(R.id.main_ll,fragment1,"1");transaction.commit();}});mFragment2Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){transaction=manager.beginTransaction();transaction.hide(fragment1).show(fragment2);transaction.commit();}});mFragment3Tv.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){
transaction=manager.beginTransaction();transaction.replace(R.id.main_ll,fragment3,"3");//transaction.add(R.id.main_ll,fragment3,"3");transaction.addToBackStack(null);transaction.commit();
}});}
privatevoidinitData(){manager=getFragmentManager();fragment1=newFragment1();fragment2=newFragment2();fragment3=newFragment3();transaction=manager.beginTransaction();transaction.add(R.id.main_ll,fragment2,"2");transaction.add(R.id.main_ll,fragment1,"1");transaction.commit();}
@OverrideprotectedvoidonStart(){super.onStart();Log.d(TAG,"onStart");}
@OverrideprotectedvoidonDestroy(){super.onDestroy();Log.d(TAG,"onDestroy");}}操作:启动app,log如下图,代码里面是先addFragment2再addFragment1,此时显示的界面是Fragment1的界面,然后点击TextViewmFragment2Tv,界面切换到了Fragment2上,而log无任何的信息打印,可见hide&show方法不触发Fragment生命周期,只影响它的显示。
(四)remove方法分析在(三)hide&show方法分析的代码基础上修改MainActivity如下:(其他代码不变,只修改为remove方法)