Fragment跟其他布局类型一样,都是Layout的扩展类,可以帮助UI变得更灵活。
Fragment的创建
Android Studio提供了Fragment的创建向导。以创建Fragment(Blank)为例。
创建过程很简单,包括三个Optional选项
(1)Create layout XML
(2)Include fragment factory methods
(3)Include interface callbacks
若默认都选,则IDE将创建一个Fragment类,及其对应的布局文件。而Fragment类中将包含以下内容:
(a)定义一个名为OnFragmentInteractionListener的Interface
(b)重写的onDetach()方法
(c)重写的onAttach()方法
(d)重写的onCreateView()方法
(e)重写的onCreate()方法
(f)静态的newInstance()工厂类方法
(g)默认的无参构建方法BlankFragment()
(h)自定义的onButtonPressed()方法(无意义)
若不选择Optional(1),则不创建布局文件
若不选择Optional(2),则不会包含内容(e),(f)
若不选择Optional(3),则不会包含内容(a),(b),(c),(h)
自动创建的BlankFragment布局文件,默认以FrameLayout作为根布局。可以改为其他布局类型,将FrameLayout放入父级Activity中,以方便与其他Fragment进行灵活地替换或删除。
Fragment的相关操作
对于Fragment的相关操作,都是通过FragmentManager和FragmentTransaction来进行性的。
(1)如何将一个Fragment替换为另一个Fragment
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
transaction.replace(R.id.layout_fragments,fragment);
transaction.commit();
(2)如何将Fragment存入栈中
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
transaction.replace(R.id.layout_fragments,fragment);
transaction.addToBackStack(null);
transaction.commit();
(3)添加一个Fragment
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
transaction.add(R.id.layout_fragments,fragment);
transaction.commit();
如果多个Fragment在同一个父容器中同时存在,且显示,则画面重叠。
(4)移除一个Fragment
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
transaction.remove(fragment);
transaction.commit();
(5)隐藏一个Fragment
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
transaction.hide(fragment);
transaction.commit();
(6)显示一个Fragment
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
transaction.show(fragment);
transaction.commit();
(7)与Activity间的通信
从Activity中获取Fragment
(FragmentXXX)getSupportFragmentManager().findFragmentById(R.id.fragmentID);
从Fragment中获取Activity
(ActivityXXX)getActivtiy();
需要注意的是,一个transaction只能commit()一次。
Fragment的生命周期
从Fragment的产生到其消亡,整个生命周期依次经历以下步骤。
addFragment:添加Fragment
onAttach:绑定父容器
onCreate:创建对象
onCreateView:创建View
onViewCreated:完成View的创建
onActivityCreated:完成父容器创建
onStart:准备前台显示
onResume:前台显示
onHiddenChanged(true):隐藏Fragment
onHiddenChanged(false):显示Fragment
onPause:暂停
onStop:停止
onDestroyView:销毁View
onDestroy:销毁对象
onDetach:取消绑定
需要注意的是,隐藏和显示,只有在状态发生变化时,才会调用onHiddenChanged方法。
addFragment,将依次经历以下流程
addFragment
onAttach
onCreate
onCreateView
onViewCreated
onActivityCreated
onStart
onResume
removeFragment,将依次经历以下流程
removeFragment
onPause
onStop
onDestroyView
onDestroy
onDetach
replaceFragment,将依次经历以下流程(将Fragment A替换为Fragment B)
replaceFragment
FragmentB: onAttach
FragmentB: onCreate
FragmentA: onPause
FragmentA: onStop
FragmentA: onDestroyView
FragmentA: onDestroy
FragmentA: onDetach
FragmentB: onCreateView
FragmentB: onViewCreated
FragmentB: onActivityCreated
FragmentB: onStart
FragmentB: onResume
可见,replace是add和remove的组合。先创建要添加的对象B,移除对象A,然后继续创建对象B的View,然后显示B。
那么用Fragment A 替换 Fragment A本身呢?
replaceFragment
Android还是很智能的,若替换的Fragment为其本身,则什么都不做。
另外需要说明的是,不要在Activity的onCreate中试图获取Fragment中的控件变量。因为Fragment的初始化,在Activity的onCreate之后调用。