1、引言
我们在开发app时,会发现有些模块是在重复使用的,如果使用activity来实现,那么在编程时就会有很多重复但不必要的地方。而在Android3.0的时候引入了Fragment,它的出现主要给大屏幕设备提供更加灵活的UI支持。Fragment本身是“碎片”的意思,我们可以把Fragment看做Activity中一个模块。 这个模块有着自己的生命周期,有着自己的界面布局,可以处理自己的输入事件,同时,Activity可以随时添加或者移除Fragment。它让我们的界面编程变得更加灵活,同时模块的复用也变得更加方便。
2、Fragment优点
(1)Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。
(2)Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸,从手机到平板电脑。
(3)Fragment是一个独立的模块,紧紧地与activity绑定在一起,可以运行中动态地添加、移除等。
(4)Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI
(5)Fragment 解决Activity间的切换不流畅,轻量切换
(6)Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载Fragment,提高性能
3、Fragment的创建
(1)在res/layout/下创建一个布局文件one.xml
1. <LinearLayout xmlns:android="//schemas.android.com/apk/res/android"
2. android:layout_width="match_parent"
3. android:layout_height="match_parent"
4. android:background="#00ff00" >
5. <TextView
6. android:layout_width="wrap_content"
7. android:layout_height="wrap_content"
8. android:text="This is a fragment"
9. android:textColor="#000000"
10. android:textSize="25sp" />
11. </LinearLayout>
(2)在src/包名/下新建一个OneFragment,继承自Fragment
1. public class OneFragment extends Fragment {
2. @Override
3. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
4. return inflater.inflate(R.layout.one, container, false);
5. }
6. }
(3)在MainActivity中动态添加Fragment
1. public class MainActivity extends Activity {
2.
3. @Override
4. protected void onCreate(Bundle savedInstanceState) {
5. super.onCreate(savedInstanceState);
6. setContentView(R.layout.activity_main);
7.
8. Button btnLoadFragOne = (Button)findViewById(R.id.btnLoadFragOne);
9. btnLoadFragOne.setOnClickListener(new View.OnClickListener() {
10. @Override
11. public void onClick(View v) {
12. FragmentManager manager = getFragmentManager(); //获取Fragment的管理器
13. FragmentTransaction transaction = manager.beginTransaction(); //启动事物
14. OneFragment oneFragment = new OneFragment(); //创建Fragment对象
15. transaction.add(R.id.fragment_container, oneFragment);//将Fragment对象添加到指定容器中
16. transaction.commit(); //提交事物
17. }
18. });
19. }
20. }
4、Fragment生命周期
(1) onAttach:onAttach()在fragment与Activity关联之后调调查用。需要注意的是,初始化fragment参数可以从getArguments()获得,但是,当Fragment附加到Activity之后,就无法再调用setArguments()。所以除了在开始时,其它时间都无法向初始化参数添加内容。
(2) onCreate:fragment初次创建时调用。尽管它看起来像是Activity的onCreate()函数,但这个只是用来创建Fragment的。此时的Activity还没有创建完成,因为我们的Fragment也是Activity创建的一部分。所以如果你想在这里使用Activity中的一些资源,将会获取不到。如果想要获得Activity相关联的资源,必须在onActivityCreated中获取。
(3) onCreateView:在这个fragment构造它的用户接口视图(即布局)时调用。在这里期望返回此Fragment的一个视图层次结构。使用LayoutInflater的inflater()方法来构造实图。
(4) onActivityCreated:在Activity的onCreate()结束后,会调用此方法。所以到这里的时候,Activity已经创建完成!在这个函数中才可以使用Activity的所有资源。
(5) onStart:当到onStart()时,Fragment对用户就是可见的了。但用户还未开始与Fragment交互。在生命周期中也可以看到Fragment的onStart()过程与Activity的onStart()过程是绑定的。意义即是一样的。以前你写在Activity的onStart()中来处理的代码,用Fragment来实现时,依然可以放在onStart()中来处理。
(6) onResume:当这个fragment对用户可见并且正在运行时调用。这是Fragment与用户交互之前的后一个回调。从生命周期对比中,可以看到,Fragment的onResume与Activity的OnResume是相互绑定的,意义是一样的。它依赖于包含它的activity的Activity.onResume。当onResume()结束后,就可以正式与用户交互了。
(7) onPause:此回调与Activity的onPause()相绑定,与Activity的onPause()意义一样。
(8) onStop:这个回调与Activity的onStop()相绑定,意义一样。
(9) onDestroyView:如果Fragment即将被结束或保存,那么撤销方向上的下一个回调将是onDestoryView()。会将在onCreateView创建的视图与这个fragment分离。下次这个fragment若要显示,那么将会创建新视图。这会在onStop之后和onDestroy之前调用。这个方法的调用同onCreateView是否返回非null视图无关。它会潜在的在这个视图状态被保存之后以及它被它的父视图回收之前调用。
(10) onDestroy:当这个fragment不再使用时调用。需要注意的是,它即使经过了onDestroy()阶段,但仍然能从Activity中找到,因为它还没有Detach。
(11) onDetach:Fragment生命周期中后一个回调是onDetach()。调用它以后,Fragment就不再与Activity相绑定,它也不再拥有视图层次结构,它的所有资源都将被释放。
热点新闻