Fragment概述
- Fragment,英文意思为“片段”,是Android 3.0(API 11)引入的新API, Fragment代表了Activity的子模块,Fragment必须被嵌入 用,同Activity类似, 它也拥有自己的生命周期!(异步刷新,教室学生分组)
- 引入Fragment的初衷是为了适应大屏幕的平板电脑。由于平板电脑的屏 幕比手机屏幕更大,因此可以容纳更多的UI组件,开发者使用Fragment 对UI组件进行分组、模块化管理,可以更方便地在运行时过程中动态更 新Activity的用户界面。
注:Fragment特点是片段调用和模块复用,此类似HTML的FrameSet!
Activity 中可以调用 FragmentManager中的findFragmentById() 或者findFragmentByTag(),来获得Fragment,同时还可调用 add() remove() replace()去删除或者替换Fragment
注意一个Activity可以有多个Fragment,一个Fragment也可以被多个Activity使用
Fragment生命周期要受 Activity的生命周期也控制
Fragment的生命周期
- 一共11个方法,根据需要选择性的重写指定方法,最常见的就是onCreateView()
- 与Activity比较几个特殊的方法
- onAttach(): 添加到Activity时被回调,与之相对的有onDetach()方法。
- onCreateView():每次创建的View片段,与之相对的有onDestoryView()方法。
- onActivityCreated():当Fragment所在的Activity被启动完成后回调该方法
- 虽然Fragment也拥有自己的生命周期,但Fragment的生命周期会受它所 在Activity的生命周期控制。例如,当Activity暂停时,该Activity内的所有 Fragment都会暂停;当Actvity被销毁时,该Activity内的所有Fragment都 会被销毁。只有当该Activity处于活动状态时,程序员可通过方法独立地操作Fragment。
创建Fragment
- 与创建Actvity类似,实现的Fragment必须继承Fragment(或Fragment的子 类),且都需要实现与Activity类似的回调方法,例如onCreate()、 onCreateView()、onStart()、onResume()、onPause()、onStop()等等。通 常来说,创建Fragment通常需要实现如下三个方法:
- onCreate():
系统创建Fragment对象后回调该方法,实现代码中初始化想在Fragment 中保持的必要组件,当Fragment被暂停或者停止后可以恢复 - onCreateView():
当Fragment绘制界面组件时会回调该方法。该方法必须返回一个View, 该View也就是该Fragment所显示的View - onPause():
当用户离开该Fragment时将会回调该方法
- onCreate():
注:几个常见子类:DialogFragment、ListFragment、PreferenceFragment
- 将创建的Fragment添加到Activity
为了在Activity中显示Fragment,还必须将Fragment添加到Activity中。将 Fragment添加到Activity中有如下两种方式:
- 在布局文件中使用
管理Fragment和处理Fragment事务
管理Fragment
Activity管理Fragment主要依靠FragmentManager对象,FragmentManager 对象可以通过getFragmentManager()获得:- 使用findFragmentById()或findFragmentByTag()方法来获取Fragment
- 调用popBackStack()方法将Fragment从后台栈中弹出(模拟用户按下 BACK按键)(查看备注)
- 调用addOnBackStackChangeListener()注册一个监听器,用户监听后台 栈的变化
- 如需添加、删除、替换Fragment,则需要借助于FragmentTransaction对 象,FragmentTransaction代表Activity对Fragment执行的多个改变
//主要Activity.java FragmentOne.java FragmentTwo.java FragmentThree.java ,都有一个输入框(默认输入一个值)和一个点击按钮, 按钮用于one-->two-->three跳转。 //主界面跳转到one的时候:正常跳转 FragmentManager fm = getFragmentManager(); FragmentTransaction tx = fm.beginTransaction(); tx.add(R.id.id_content, new FragmentOne(),"ONE"); tx.commit(); //one到two的时候: 注意是 repalce并且加入了回退栈,不加,再按回退键会直接退出当前activity FragmentTwo fTwo = new FragmentTwo(); FragmentManager fm = getFragmentManager(); FragmentTransaction tx = fm.beginTransaction(); tx.replace(R.id.id_content, fTwo, "TWO"); tx.addToBackStack(null); tx.commit(); //two到Three的时候:注意是添加不是替换,同时加入回退栈。记住每一次都要修改输入框的值 FragmentThree fThree = new FragmentThree(); FragmentManager fm = getFragmentManager(); FragmentTransaction tx = fm.beginTransaction(); tx.hide(this); tx.add(R.id.id_content , fThree, "THREE"); tx.addToBackStack(null); tx.commit(); //Three--》two:发现修改过的值 还在 //two--》one 发现修改过的值不在了 //推论出: repalce == remove+ add
替换Fragment及事务处理的示例
java
Fragment rightFragment = new RightFragment();
// 开启事务
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
// 执行替换
fragmentTransaction.replace(R.id.right_fragment, rightFragment);
// 将事务添加到back栈,允许用户按BACK按钮回到替换Fragment前的状态
fragmentTransaction.addToBackStack(null);
// 提交事务
fragmentTransaction.commit();
Fragment与Activity通信
- Fragment与Activity交互
*Fragment获取它所在的Activity:
调用Fragment的getActivity()方法即可返回它所在的Activity。
- Activity获取它所包含的Fragment:
调用Activity关联的FragmentManager的findFragmentById(int id)或 findFragmentByTag(String tag)方法获取
- Activity获取它所包含的Fragment:
- 除此之外,Fragment与Activity可能还需要相互传递数据
- Fragment向Activity传递数据:
在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实 现该回调接口,这样Fragment即可调用该回调方法将数据传给Activity - Activity向Fragment传递数据:
在Activity中创建Bundle数据包,并调用Fragment的setArgument(Bundle
bundle)方法即可将Bundle数据包传给Fragment - Fragmeng向Fragment传递数据(结合第1)和第2)步)
- Fragment向Activity传递数据:
github实例源码:https://github.com/mikelkl/FragmentTest
预览图: