文档开发者中心
我的

【综合】Android学习笔记:碎片(Fragment)

一、概念

(1)Fragment是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间。

(2)一般建议使用support-v4库中的Fragment,因为它可以让碎片在所有Android系统版本中保持功能一致。

(3)通过LayoutInflater的inflate()方法加载fragment布局。

(4)Fragment必须被嵌入一个Activity中,它们的生命周期直接受宿主Activity的影响。

(5)当一个Activity正在运行时,可以独立地操作其中的每一个Fragment,如添加或删除。


注:Fragment的特点

Fragment的设计主要是把Activity界面包括其逻辑打碎成很多个独立的模块,这样便于模块的重用和更灵活地组装,呈现出多样的界面。

(1)Fragment可以作为Activity界面的一个部分组成。

(2)可以在一个Activity里面出现多个Fragment,并且一个Fragment可以在多个Activity中使用。

(3)在Activity运行中,可以动态地添加、删除、替换Fragment。

(4)Fragment有自己的生命周期的,可以响应输入事件。


二、静态加载碎片

静态加载只需要把Fragment当成普通的UI控件放到界面Layout中。


三、动态加载碎片

动态加载碎片的步骤:


①创建待添加的碎片实例;

②获取FragmentManager,在活动中可以直接通过调用getSupportFragmentManager()方法得到;

③开启一个事务,通过调用beginTransaction()方法开启;

④向容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例;

⑤提交事务,调用commit()方法来完成;



注:FragmentTransaction中提供了一个addToBackStack()方法,可以用于将一个事务添加到返回栈中。


四、碎片和活动之间的通信

1、在Activity中获取Fragment实例

若Activity中包含自己管理的Fragment引用,可以直接访问Fragment的公有方法进行相应操作。


若Activity中未保存Fragment的引用,则通过getFragmentManager().findFragmentByTag()或者findFragmentById()获得相应Fragment实例,然后进行操作。


①活动→findFragmentById()→碎片

②FragmentManager提供了一个类似于findViewById()方法的findFragmentById()方法(专门用于从布局文件中获取碎片的实例),可以在活动中得到相应碎片的实例,然后就可以轻松调用碎片里的方法了。

2、在Fragment中获取Activity实例

在Fragment中可以通过getActivity()方法得到当前绑定的Activity实例,然后进行相应的操作。


注意:在Fragment中可以通过getActivity()方法来获取Context,若需要让Context在Activity被销毁后还存在,则可以用getActivity().getApplicationContext()来获取。


①碎片→getActivity()→活动

②在每个碎片中都可以通过getActivity()方法来得到和当前碎片相关联的活动实例。


五、碎片的状态

1、运行状态:当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。

2、暂停状态:当一个活动进入暂停状态时,与它相关联的可见碎片就会进入到暂停状态。

3、停止状态:当一个活动进入停止状态时,与它相关联的碎片就会进入到停止状态,或者通过FragmentTransaction的remove()、replace()方法将碎片从活动中移除。

4、销毁状态:碎片总是依附于活动的存在而存在,因此当活动被销毁时,与它相关联的碎片就会进入到销毁状态。

六、碎片的生命周期


onAttach():当碎片和活动建立关联的时候调用

onCreate():当第一次创建碎片的时候调用

onCreateView():为碎片创建视图(加载布局)时调用

onActivityCreated():确保与碎片相关联的活动一定已经创建完毕的时候调用,也就是当Activity中的onCreate()方法执行完后调用

onStart():碎片从不可见变为可见时调用

onResume():碎片准备好与用户进行交互时调用

onPause():碎片处于暂停状态时调用

onStop():碎片处于停止状态时调用

onDestroyView():碎片中视图被移除时调用

onDestroy():碎片销毁之前调用

onDetach():当碎片和活动解除关系的时候调用

注:在碎片中可以通过onSaveInstanceState()方法来保存数据,因为进入停止状态的碎片有可能在系统内存不足时被回收。保存下来的数据可以在onCreate()、onCreateView()和onActivityCreated()这3个方法中重新得到,它们都含有一个Bundle类型的savedInstanceState参数。


七、多Fragment切换

1、如何切换Fragment?

首先分别获取FragmentManager与FragmentTransaction的实例,然后创建一个Fragment实例,接下来调用FragmenTransaction对象的replace()方法与commit()方法来完成Fragment的切换。如下:



2、切换优化

虽然上述方法可以切换Fragment,但是面对大量点击来回切换,或者本来就有非常多的Fragment,会导致OOM。


1、预加载模式

在加载第一个Fragment时就把全部Fragment加载好。下次直接调用。

2、动态加载模式

所有的Fragment只实例化一次,实例化的Fragment会被存入内存,下次切换会判断内存中是否含有要切换的Fragment,如果有就直接复用,没有就add一个新的。

点赞
收藏
回复
11
分享
举报
浏览1407 发布于2019-11-06 01:40未知归属地
全部评论
最多点赞
最新发布
最早发布

点击查看:Android学习笔记:WebView

11楼回复于2019-11-06 02:04 未知归属地

点击查看:Android学习笔记:ButterKnife插件

10楼回复于2019-11-06 02:04 未知归属地

点击查看:Android学习笔记:WebView

9楼回复于2019-11-06 02:04 未知归属地

点击查看:Android学习笔记:EventBus和otto

8楼回复于2019-11-06 02:03 未知归属地

点击查看:Android学习笔记:AsyncTask

7楼回复于2019-11-06 02:03 未知归属地

点击查看:Android学习笔记:SharedPreferences

6楼回复于2019-11-06 02:03 未知归属地

点击查看:Android学习笔记:活动(Activity)

5楼回复于2019-11-06 02:02 未知归属地

点击查看:Android学习笔记:Handler

4楼回复于2019-11-06 02:02 未知归属地

点击查看:Android学习笔记:Volley

3楼回复于2019-11-06 02:02 未知归属地

点击查看:Android学习笔记:服务(Service)

2楼回复于2019-11-06 02:02 未知归属地
共2页
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。