生命周期
Fragment的生命周期和Activity的类似,而且它依赖于Activity存在,跟随Activity的消亡而销毁。基本生命周期如下图所示:
- onAttach():Fragment和Activity相关联时调用。可以通过该方法获取Activity引用,还可以通过getArguments()获取参数。
- onCreate():Fragment被创建时调用。
- onCreateView():创建Fragment的布局,一般在这里进行资源初始化工作。
- onActivityCreated():当Activity完成onCreate()时调用。
- onStart():当Fragment可见时调用。
- onResume():当Fragment可见且可交互时调用。
- onPause():当Fragment不可交互但可见时调用。
- onStop():当Fragment不可见时调用。
- onDestroyView():当Fragment的UI从视图结构中移除时调用。
- onDestroy():销毁Fragment时调用。
- onDetach():当Fragment和Activity解除关联时调用。
注册方式
静态注册
将fragment以标签的方式加入到布局文件中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/ll_main_root">
<fragment
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/frag_1"
android:layout_weight="1"
android:tag="frag_tag_1"
name="com.example.test.FragmentA" />
<fragment
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/frag_2"
android:layout_weight="1"
android:tag="frag_tag_2"
name="com.example.test.FragmentB"
/>
</LinearLayout>
动态注册
动态添加、删除和替换Fragment
//常用方法
transaction.add() :往Activity中添加一个Fragment
transaction.remove() :从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁。
transaction.replace():使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
transaction.hide():隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
transaction.show():显示之前隐藏的Fragment
transaction.show():显示之前隐藏的Fragment
transaction.detach():会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护
transaction.attach():重建view视图,附加到UI上并显示
FragmentManager fragmentManager = getFragmentManager();//获取Fragment管理类
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//获取食物类
FragmentA fragmentA = new FragmentA();
fragmentTransaction.add(R.id.ll_main_root,fragmentA);//添加
FragmentB fragmentB = new FragmentB();
fragmentTransaction.replace(R.id.ll_main_root,fragmentB);//替换
fragmentTransaction.remove(fragmentB);//删除
不同的提交方式的区别
- commit():int
该方法必须在Activity的onSaveInstanceState方法之前执行,否则在系统因为内存不足或旋转屏幕等原因造成Activity被回收时,Fragment状态丢失(如果在onSaveInstanceState方法之后执行,那么此方法保存不了事务提交的Fragment的最新状态),这种情况下会抛出异常:llegalStateException(“Can not perform this action after onSaveInstanceState”)。如果我们不在乎 Fragment 的状态的话,官方推荐使用 commitAllowingStateLoss() 方法。
注意事项
1.在 Activity 中调用 commit() 方法的时候,应该注意在 onCreate() 或者是在FragmentActivity#onResume()Activity#onPostResume() 中调用。后者是保证 Activity 的状态已经完全恢复,避免出现 IllegalStateException.
2.避免在异步任务中调用 commit,因为异步任务不能确保Activity的状态,如果 Activity 已经调用 onStop() 方法,此时再 Commit() 就会报错。
3.如果不在乎 Fragment 状态丢失,可以使用 commitAllowingStateLoss() 方法
4.同一个 transaction 中只能调用一次 commit()
- commitAllowingStateLoss():int
和 commit() 方法调用的是同一个方法,但是设置了可忽略状态。从 commit() 方法的流程中我们可以看出,使用 commitAllowingStateLoss()确实可以避免发生状态丢失的异常,但是我们在使用的时候,还是应该尽量少使用这个方法,而是正确、安全的使用 commit(),使问题能够得到正确的解决。
- commitNow():void
commitNow()方法是立即执行,而不是等待 Activity 的 Handler 准备好了。commitNow()方法产生的 Fragment 不能添加到回退栈。和commit一样,会检查Activity的状态,即如果在onSaveInstanceStated方法之前调用会抛出异常。
- commitNowAllowingStateLoss():void
除了不检查 Activity 的状态以外,其他方面和 CommitNow一样