Fragments是Android3.0引入的概念,译为片段、碎片,为了解决不同屏幕分辩率的动态和灵活UI设计。
Fragment表现Activity中UI的一个行为或者一部分。可以将多个fragment组合在一起,放在一个单独的activity中来创建一个多界面区域的UI,并可以在多个activity里重用某一个fragment。把fragment想象成一个activity的模块化区域,有它自己的生命周期,接收属于它自己的输入事件,并且可以在activity运行期间添加和删除。
Fragment必须总是被嵌入到一个activity中。它们的生命周期直接受其宿主activity的生命周期影响。 例如:当activity被暂停,那么在其中的所有fragment也被暂停;当activity被销毁,所有隶属于它的fragment也被销毁。然而,当一个activity正在运行时(处于resumed状态),我们可以独立地操作每一个fragment,比如添加或删除它们。当处理这样一种fragment事务时,可以将它添加到activity所管理的back stack —— 每一个activity中的back stack实体都是一个发生过的fragment事务的记录。back stack允许用户通过按下 BACK 按键从一个fragment事务后退(往后导航)。
将一个fragment作为activity布局的一部分添加进来时,它处在activity的view hierarchy中的ViewGroup中,并且定义有它自己的view布局。通过在activity的布局文件中声明fragment来插入一个fragment到你的activity布局中,或者可以写代码将它添加到一个已存在的ViewGroup。然而,fragment并不一定必须是activity布局的一部分;如果愿意的话,也可以将一个fragment隐藏在activity的后台工作。
Fragments的生命周期如下图:
要创建一个fragment,必须创建一个 Fragment 的子类(或者继承自一个已存在的它的子类)。 Fragment 类的代码看起来很像Activity。它包含了与activity类似的回调方法,例如onCreate()、onStart()、onPause(),以及onStop()。事实上,如果你准备将一个现成的Android应用转换到使用fragment技术,可能只需简单的将代码从activity的回调函数分别移动到fragment的回调方法。
使用Fragments 必须实现的三个回调方法分别为:
(1)onCreate 系统创建Fragments时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity 中的onCreate相当。
(2)onCreateView 用于首次绘制用户界面的回调方法,必须返回要创建的Fragments视图UI。如果不希望提供Fragments用户界面可以返回NULL。
(3)onPause 当用户离开Fragments时调用,这时需要提交任何应该持久的变化,因为用户可能不会回来。
提供Fragments的界面必须重写onCreateView()方法:
public static class ExampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.example_fragment, container, false);
}
}
inflate()方法的三个参数:
第一个是resource ID,指明了当前的Fragment对应的资源文件;
第二个参数是父容器控件;
第三个布尔值参数表明是否连接该布局和其父容器控件,在这里的情况设置为false,因为系统已经插入了这个布局到父控件,设置为true将会产生一个多余的ViewGroup。
当Fragment被加入Activity中时,它会处在对应的ViewGroup中。
Fragment有两种加载方式:
(1)在Activity的layout中使用标签<fragment>声明。
(2)在代码中把它加入到一个指定的ViewGroup中。
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
系统内置了三种Fragments ,这三种Fragments 分别有不同的应用场景:
(1)DialogFragment 对话框式的Fragments,可以将一个Fragments对话框并到activity管理的Fragments Back Stack中,允许用户回到一个曾经摒弃的Fragments。
(2)ListFragments 类似于ListActivity的效果,并且提供了ListActivity类似的onListItemCLick和setListAdapter等方法。
(3)PreferenceFragments 类似于PreferenceActivity,可以用来创建类似IPAD的设置界面。