这是我参与【第四届青训营】笔记创作活动的第1天
Android中Activity控件用来显示程序的页面,在Activity控件中可以使用Fragment,与Activity控件类似Fragment有自己的生命周期以及响应事件,如果需要UI的话也可以创建一个对应的布局。
Fragment要点
1、Activity如同一个容器可以存放Fragment,在一个Activity中可以使用多个Fragment,而且每个Fragment可以被多个Activity使用。 2、可以通过Fragment所在的Activity控件中对Fragment进行控制,Fragment的创建也是在Activity的生命周期中实现。
Fragment创建
有UI的Fragment
要用到Fragment就需要从创建开始,通过在你需要创建Fragment的Activity的布局文件中声明fragment,和其他的View声明方式类似,使用标签(需要实现继承Fragment的子类,则可以通过标签中的android:name属性指向实例化的类所在位置)然后通过布局文件中标准的属性设置方式为其设置需要的属性。当然和其它的View类似可以完全通过代码,而不依赖于布局文件来实现一个Fragment。
将需要添加至Activity的fragment存放在已存在的ViewGroup中,需要通过Activity来操作fragment中的事务,所以需要使用FragmentTransaction的API。 在Activity中通过getFragmentManager()方法获取到FragmentManager对象,再通过FragmentManager对象的biginTransaction()方法得到需要的FragmentTransaction对象。通过FragmentTransaction对象的add()方法,第一个参数为int型数据,表示需要放置Fragment的ViewGroup的ID,第二个参数即为需要放置的Fragment对象。最后调用FragmentTransaction对象的commit()方法,使得添加的fragment生效。
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction=fragmentManager .beginTransaction(); MyFragment fragment = new Fragment(); fragmentTransaction.add(R.id.fragment,fragment); fragmentTransaction.commit();
无UI的Fragment
也可以添加没有UI的Fragment,不过由于没有View所以需要通过添加一个唯一的字符串来标识。而添加没有UI的Fragment同样需要FragmentTransaction的add()方法,参数略微有些不同,第一个参数为需要添加的fragment,第二个参数为表示唯一标识的字符串。如果需要在activity中获取此fragment则可以通过findFragmentByTag()方法,通过设置的唯一标识字符串获取。
Fragment生命周期
Fragment的生命周期与Activity的生命周期相似,具体可以分为onAttach、onCreate、onCreateView、onActivityCreated、onStart、onResume、onPause、onStop、onDestroyView、onDestroy、onDetach生命周期。对比Activity的状态,Fragment同样可以分为3个状态,Resumed状态、Paused状态和Stopped状态,与其对应的Activity相关联。Fragment所生存的Activity的生命周期,直接影响Fragment的生命周期,每一个Activity的生命周期的回调行为都会引起每一个当前Activity中的Fragment的类似回调。 Fragment还提供一些额外的生命周期回调方法。 onAttach():当fragment被绑定到activity时被调用; onCreateView():创建和Fragment关联的view时调用; onActivityCreated():当activity的onCreate()方法返回时被调用; onDetach():当Fragment从activity解除关联时被调用。
Activity中操作时Fragment的生命周期变化 1、打开界面 Fragment onCreate()->Fragment onCreateView()->Activity onCreate()->Fragment onActivityCreated()->Activity onStart()->Fragment onStart()->Activity onResume()->Fragment onResume() 2、按下主屏幕键 Fragment onPause()->Activity onPause()->Fragment onStop()->Activity onStop() 3、重新打开界面 Activity onRestart()->Activity onStart()->Fragment onStart()->Activity onResume()->Fragment onResume() 4、按后退键 Fragment onPause()->Activity onPause()->Fragment onStop()->Activity onStop()->Fragment onDestroyView()->Fragment onDestory()->Fragment onDetach()->Activity onDestory()
创建和重新加载Activity在Fragment之前,退出和释放Fragment在activity之前,说明Activity为Fragment的容器。
Fragment事务
在Activity中可以进行Fragment的添加、替换和移除事务。
添加事务
添加事务在前面的Fragment创建提及。
替换fragment事务
替换fragment使用FragmentTransaction对象的replace()方法,参数与添加方法类似,第一个参数为int类型表示需要添加到的ID,第二个参数为需要替换的新fragment对象。如果考虑将需要将替换之前的状态保存到Activity的返回栈中,则可调用FragmentTransaction对象的addToBackStack()方法,参数为“null”,此方法可以实现在点击返回键时可以回退到上一个Fragment状态,最后调用FragmentTransaction对象的comnit()方法,使替换生效。
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction=fragmentManager .beginTransaction(); fragmentTransaction.replace(R.id.fragment,newFragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit();
移除Fragment事务
移除可以调用FragmentTransaction对象的remove()方法,同时也可以考虑使用FragmentTransaction对象的addToBackStack()方法,实现返回可回退至此Fragment。
Fragment通信
Fragment与Activity通信
在 fragment 中可以调用 getActivity() 获取 activity 的实例并调用 activity 里的方法和布局,同样在 activity 里借助 FragmentManager也可以通过 findFragmentById() 或 findFragmentByTag() 方法获取 fragment 的实例 。
Fragment与Fragment通信
Fragment与Fragment之间是不能直接通信的,只能在同一个Activity的条件下通过Activity进行通信。