Fragment——简单介绍


生命周期

Fragment的生命周期和Activity的类似,而且它依赖于Activity存在,跟随Activity的消亡而销毁。基本生命周期如下图所示:
life-circle

  • 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一样

参考1
参考2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值