知识总结-----Fragment

本文详细介绍了Fragment的生命周期方法,如onAttach、onCreate、onCreateView等,并探讨了为何引入Fragment以及在Activity中加载Fragment的两种方式。此外,还对比了FragmentPagerAdapter和FragmentStatePagerAdapter的内存管理差异。最后,文章讨论了Fragment间的通信策略和FragmentManager的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fragment每个生命周期方法的意义、作用:

setUserVisibleHint():设置Fragment可见或者不可见时会调用此方法。在该方法里面可以通过调用getUserVisibleHint()获得Fragment的状态是可见还是不可见的,如果可见则进行懒加载操作。

onAttach():执行该方法时,Fragment与Activity已经完成绑定,该方法有一个Activity类型的参数,代表绑定的Activity,这时候你可以执行诸如mActivity = activity的操作。

onCreate():初始化Fragment。可通过参数savedInstanceState获取之前保存的值。

onCreateView():初始化Fragment的布局。加载布局和findViewById的操作通常在此函数内完成,但是不建议执行耗时的操作,比如读取数据库数据列表。

onActivityCreated():执行该方法时,与Fragment绑定的Activity的onCreate方法已经执行完成并返回,在该方法内可以进行与Activity交互的UI操作,所以在该方法之前Activity的onCreate方法并未执行完成,如果提前进行交互操作,会引发空指针异常。

onStart():执行该方法时,Fragment由不可见变为可见状态。

onResume():执行该方法时,Fragment处于活动状态,用户可与之交互。

onPause():执行该方法时,Fragment处于暂停状态,但依然可见,用户不能与之交互。

onSaveInstanceState():保存当前Fragment的状态。该方法会自动保存Fragment的状态,比如EditText键入的文本,即使Fragment被回收又重新创建,一样能恢复EditText之前键入的文本。

onStop():执行该方法时,Fragment完全不可见。

onDestroyView():销毁与Fragment有关的视图,但未与Activity解除绑定,依然可以通过onCreateView方法重新创建视图。通常在ViewPager+Fragment的方式下会调用此方法。

onDestroy():销毁Fragment。通常按Back键退出或者Fragment被回收时调用此方法。

onDetach():解除与Activity的绑定。在onDestroy方法之后调用。

为什么引入Fragment?

Android在api11中加入了Fragment,主要是给大屏设备上进行动态灵活的UI设计提供支持,更多的情况下我们把Fragment作为一个可重复利用的模块化组件,利用它自身的生命周期来对功能模块进行分离。

Fragment加载到Activity的两种方式:

  1. 静态加载,直接添加Fragment到Activity的布局文件房中。
  2. 动态的在Activity中添加Fragment

FragmentPagerAdapter与FragmentStatePagerAdapter的区别?

FragmentPagerAdapter一般用于少量界面的ViewPager,划过的Fragment会一直保存在内存中不会被销毁。而FragmentStatePagerAdapter适用于界面较多的ViewPager,它会保存当前的界面以及下一个界面和上一个界面,最多保存三个,其他的会在destroyItem()方法中被销毁调,可以节省内存占用。

 

Fragment通信

1、在Fragment中调用Activity中的方法:

 

第一种方法:在Fragment中法,通过getActivity(). 调用Activity中的公开方法;

第二种方法:在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity类实现这个接口,这样Fragment就能够调用这个回调方法,将数据传给Activity。

 

2、在Activity中调用Fragment中的方法:

   第一种方法:在Activity中调用Fragment的方法, getFragmentManager().findFragmentById(R.id.xxx);

第二种方法:创建Bundle数据包,并调用Fragment对象的setArguments方法, 之后在Fragment类中调用getArguments;

 

3、在Fragment中调用Fragment中的方法:

 

第一种方法:通过宿主Activity调用另一个Fragment中的方法,getActivity().getFragmentManager().findFragmentById();

第二种方法:接口回调,在F1里面定义接口,Activity里面实现接口。通过回调实现F1与其父亲Activity的通信。在Activity接口回调方法里与F2通信,将参数传给F2;

第三种方法:使用广播,F1中将数据放在广播中发送,F2中接受广播,获取数据。

 

Framgnt 管理器:FragmentManger

如何获取 FragmentManger

Activity 中通过 getSupportFragmentManager 获取

Fragment 中通过 getChildFragmentManager 获取

常用方法

add 添加一个 Fragment 实例

remove 移除一个 Fragment 实例

replace 替换一个 Fragment 实例


 

Fragment的replace、add、remove方法

add 是把一个Fragment添加到一个容器当中。一般在使用add的时候会配合 hide,show一起使用,为了避免Fragment的重复创建节省资源。

 

replace 在添加Fragment到容器之前先移除掉相同id的所有Fragment然后再进行添加

 

1、Fragment 的容器是一个 FrameLayout,add 的时候是把所有的 Fragment 一层一层的叠加到了 FrameLayout上了, 而replace的话首先将该容器中的其他Fragment去除掉然后将当前Fragment 添加到容器中。

2、一个 Fragment 容器中只能add一个 Fragment 种类,如果多次添加则会报异常,导致程序终止, 而 replace 则无所谓,随便切换。

因为通过 add 的方法添加的 Fragment,每个 Fragment 只能添加一次,因此如果要想达到切换效 果需要通过 Fragment 的的 hide 和 show 方法结合者使用。将要显示的 show 出来,将其他 hide 起来。这个过程Fragment的生命周期没有变化。

3、通过 replace 切换 Fragment,每次都会执行上一个 Fragment 的 onDestroyView,新 Fragment 的 onCreateView、onStart、onResume 方法。

 

 

无法在activity调用了onSaveInstanceState之后再执行commit进行添加Fragment

Activity被系统回收(界面已经不存在了),为了能在下次打开的时候恢复原来的样子,系统为我们保存界面的所有状态,这个时候再去修改界面理论上肯定是不被允许的,为了避免这种异常可以使用:

transaction.commitAllowingStateLoss();来提交添加Fragment到Activity的事务,与commit()不同的是使用这种方法允许丢失界面的状态和信息。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值