多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 生命周期 ![](https://img.kancloud.cn/86/6e/866e54d0f36a0f2c937bfec9d97f3a1d_340x675.png) 可以看到Fragment比Activity多了几个额外的生命周期回调方法: **onAttach(Activity)** 当Fragment与Activity发生关联时调用。 **onCreateView(LayoutInflater, ViewGroup,Bundle)** 创建该Fragment的视图 **onActivityCreated(Bundle)** 当Activity的onCreate方法返回时调用 **onDestoryView()** 与onCreateView想对应,当该Fragment的视图被移除时调用 **onDetach()** 与onAttach相对应,当Fragment与Activity关联被取消时调用 注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现 ## 静态使用Fragment 1. 继承Fragment,重写onCreateView决定Fragemnt的布局 2. Activity中声明此Fragment,就当和普通的View一样 ~~~ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <fragment android:layout_below="@id/id_fragment_title" android:id="@+id/id_fragment_content" android:name="com.zhy.zhy_fragments.ContentFragment" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </RelativeLayout> ~~~ ## FragmentTransaction ~~~ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/id_content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/id_ly_bottombar" android:layout_below="@id/id_fragment_title" /> </RelativeLayout> ~~~ ~~~ FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); ContentFragment mWeixin = new ContentFragment(); transaction.replace(R.id.id_content, mWeixin); transaction.commit(); ~~~ ### FragmentManager 主要用于在Activity中操作Fragment 通过getFragmentManager() // v4中,getSupportFragmentManager获取 ### FragmentTransaction 保证一些列Fragment操作的原子性,熟悉事务这个词,一定能明白 FragmentTransaction transaction = fm.**benginTransatcion();** /开启一个事务 **transaction.add()** 往Activity中添加一个Fragment **transaction.remove()** 从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。 **transaction.replace()** 使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~ **transaction.hide()** 隐藏当前的Fragment,仅仅是设为不可见,并不会销毁 **transaction.show()** 显示之前隐藏的Fragment **detach()** 会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。 **attach()** 重建view视图,附加到UI上并显示。 **transatcion.commit()** 提交一个事务 **addToBackStack("fname")** 可选的。FragmentManager拥有回退栈(BackStack),类似于Activity的任务栈,如果添加了该语句,就把该事务加入回退栈,当用户点击返回按钮,会回退该事务(回退指的是如果事务是add(frag1),那么回退操作就是remove(frag1));如果没添加该语句,用户点击返回按钮会直接销毁Activity。 注意:常用Fragment的哥们,可能会经常遇到这样Activity状态不一致:State loss这样的错误。主要是因为:**commit方法一定要在Activity.onSaveInstance()之前调用。** 上述,基本是操作Fragment的所有的方式了,在一个事务开启到提交可以进行多个的添加、移除、替换等操作。 值得注意的是:如果你喜欢使用Fragment,一定要清楚这些方法,哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏,这样才能更好的使用它们。 ## 用法 * 我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,**希望保留用户操作的面板,你可以使用hide和show**,当然了不要使劲在那new实例,进行下非null判断。 * 我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。 * remove 和 detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。 ## 参考资料 [Android 进阶17:Fragment FragmentManager FragmentTransaction 深入理解](https://blog.csdn.net/u011240877/article/details/78132990) [Android Fragment 非常详细的一篇](https://www.jianshu.com/p/11c8ced79193) [Android Fragment 真正的完全解析(下)](https://blog.csdn.net/lmj623565791/article/details/37992017) [Fragment的相关用法第三篇(张鸿洋)](https://blog.csdn.net/u010597493/article/details/53992732)