Fragment表明了 Activity的子模块,所以能够把Fragment理解成Activity片断。Fragment用于本身的生命周期,也能够接受它本身的输入事件。java
Fragment必须被“嵌入” Activity中使用,所以虽然Fragment也拥有本身的生命周期,但Fragment的生命周期会受它所在的Activity的生命周期的控制。例如,当Activity暂停时,该Activity内的全部Fragment都会暂停;当Activity被销毁时,该Activity内的全部Fragment 都会被销毁,只有当该Activity处于活动状态时,程序员可经过方法独立地操做Fragment。android
fragment引入的缘由是为了响应式适配:程序员
例子: tablet , phone数据库
tablet-main-activity{ navFragment + contentFragment } phone-main-activity { navFragment } phone-content-activity{ contentFragment }
与Activity相似的是,Fragment也存在以下状态。数组
活动状态:当前Fragment位于前台,用户可见,能够得到焦点。app
暂停状态:其余Activity位于前台,该Fragment依然可见,只是不能得到焦点。ide
中止状态:该Fragment不可见,失去焦点。布局
销毁状态:该Fragment被彻底删除,或该Fragment所在的Activity被结束。翻译
Fragment老是做为Activity界面的组成部分,Fragment可调用getActivity()方法获取它所在的 Activity, Activity调用FragmentManager 的findFragmentByld()或findFragmentByTag()方法来获取Fragment。code
在Activity 运行过程当中,可调用 FragmentManager 的add()、remove()、replace()方法动态地添加、删除或替换Fragment。
—个Activity能够同时组合多个Fragment;反过来,一个Fragment也可被多 Activity 复用。
Fragment能够响应本身的输入事件,并拥有本身的生命周期,但它们的生命周期直接被其所属的Activity的生命周期控制。
fragment类关系
android.app.Fragment extends Object implements ComponentCallbacks2 View.OnCreateMenuListener subclass DialogFragment, ListFragment, PreferenceFragment, WebViewFragment
生命周期回调方法
// 当该Fragment被添加到Activity时被回调。该方法只会被调用一次 onAttatch() // 系统建立Fragment对象后回调该方法,实现代码中只初始化想要在 // Fragment中保持的必要组件,当fragment被暂停或者中止后能够恢复。 onCreate() -> // 当Fragment绘制界面组件时会回调该方法。该方法必须返回一个View, // 该View也就是该Fragment所显示的View。 onCreateView() -> // 当 Fragment 所在的 Activity 被启动完成后回调该方法 onActivityCreated() // 启动 Fragment 时被回调 onStart -> // 恢复 Fragment 时被回调,onStart()方法后必定会回调()onResume()方法 onResume -> // 当用户离开该Fragment时将会回调该方法。 onPause -> onStop() -> // 销毁该 Fragment 所包含的 View 组件时调用 onDestroyView() -> // 销毁Fragment时被回调。该方法只会被调用一次。 onDestroy() -> // 将该 Fragment 从 Activity 中被删除、被替换完成时回调该方法,onDestroy() // 方法后必定会回调onDetach()方法。该方法只会被调用一次。 onDetach()
开发Fragment与开发Activity很是类似,区别只是开发Activity须要继承Activity或其子类;但开发Fragment须要继承Fragment及其子类, 与此同时,只要将原来写在Activity回调方法的代码“移到”Fragment的回调方法中便可。
public class BookDetailFragment extends Fragment { public static final String ITEM_ID = "item_id"; // 保存该Fragment显示的Book对象 BookContent.Book book; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 若是启动该Fragment时包含了ITEM_ID参数 if (getArguments().containsKey(ITEM_ID)) { book = BookContent.ITEM_MAP.get(getArguments() .getInt(ITEM_ID)); //① } } // 重写该方法,该方法返回的View将做为Fragment显示的组件 @Override public View onCreateView(LayoutInflater inflater , ViewGroup container, Bundle savedInstanceState) { // 加载/res/layout/目录下的fragment_book_detail.xml布局文件 View rootView = inflater.inflate(R.layout.fragment_book_detail, container, false); if (book != null) { // 让book_title文本框显示book对象的title属性 ((TextView) rootView.findViewById(R.id.book_title)) .setText(book.title); // 让book_desc文本框显示book对象的desc属性 ((TextView) rootView.findViewById(R.id.book_desc)) .setText(book.desc); } return rootView; } }
在布局文件中添加:在布局文件中使用元素添加Fragment,其中的android:name属性必须指定Fragment的实现类。
在Java代码中经过FragmentTransaction对象的relpace()或add()方法来替换或添加Fragment。Activity的getFragmentManager()方法返回FragmentManager,经过调用FragmentManager的beginTransaction()方法获取FragmentTransaction对象。
Fragment获取它所在的Activity:调用Fragment的getActivity()方法便可返回它所在的Activity。
Activity 获取它包含的Fragment:调用 Activity 关联的 FragmentManager 的 findFragmentByld(int id)或findFragmentByTag(String tag)方法便可获取指定的 Fragment。
在界面布局文件中使用元素添加Fragment时,能够为元素指定android:id或android:tag属性,这两个属性均可用于标识该 Fragment,接下来 Activity 将可经过 findFragmentByld(int id)或 findFragmentByTag(String tag)来获取该 Fragment。
Activity向Fragment传递数据: 在Activity中建立Bundle数据包, 并调用Fragment 的setArguments(Bundle bundle)方法便可将 Bundle 数据包传给 Fragment。
Fragment向Activity传递数据或Activity须要在Fragment运行中进行实时通讯: 在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口,这样Fragment便可调用该回调方法将数据传给Activity。
使用 findFragmentByld()或 findFragmentByTag()方法来获取指定 Fragment。
调用popBackStack()方法将Fragment从后台找中弹出(模拟用户按下BACK按键)。
调用addOnBackStackChangeListener()注册个监听器,用于监听后台栈的变化。若是须要添加、删除、替换Fragment,则须要借助FragmentTransaction对象, FragmentTransaction 表明 Activity 对 Fragment 执行的多个改变。
ragmentTransaction也被翻译为Fragment事务。与数据库事务相似的是,数据库事务表明了对底层数组的多个更新操做;而Fragment事务则表明了Activity对Fragment执行的多个改变操做。
每一个FragmentTransaction能够包含多个对Fragment的修改,好比包含调用多个add()、replace()、和remove()操做,最后调用commit()提交事务便可。
在调用commit()以前,开发者也可调用addToBackStack()将事务添加到back栈,该栈由Activity负责管理,这样容许用户按BACK按键返回到前一个Fragment状态。