当前位置: 首页 > news >正文

Android Fragment碎片

什么是碎片?

  碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛。可以把Fragment当成Activity一个界面的一部分,那么 Activity的界面就由完全不同的Fragment组成,且Fragment有自己的声明周期和接收、处理用户的事件,支持动态的添加、替换、移除某个Fragment。

为什么使用碎片?

  我们知道,Android上的界面展示都是通过Activity实现的,但Activity也有它的局限性,同样的界面在手机上显示可能很好看,在平板上就未必了,因为平板的屏幕非常大,手机的界面放在平板上可能会有过分被拉长、控件间距过大等情况。这个时候更好的体验效果是在Activity中嵌入"小Activity",然后每个"小Activity"又可以拥有自己的布局。这就用到了Fragment。

比如我们想做一个新闻应用,其中一个界面使用ListView展示了一组新闻的标题,当点击了其中一个标题,就打开另一个界面显示新闻的详细内容。如果是在手机竖屏时,我们可以将新闻标题列表放在一个Activity中,将新闻的详细内容放在另一个Activity中,如下图所示。

 

 

但是在平板设计中,横屏时的显示就是下面这种情况,列表会被拉长

 

 

因此,更好的设计方案是将新闻标题列表界面和新闻详细内容界面分别放在两个Fragment中,然后在同一个Activity中引入这两个Fragment,如下图所示。

 

 

Fragment的特点:

(1)Fragment依赖于Activity,不能独立存在。

(2)一个Activity里可以有多个Fragment。

(3)一个Fragment可以被多个Activity重用。

(4)Fragment有自己的生命周期,并能接收输入事件。

(5)可以在Activity运行时动态地添加或删除Fragment。

Fragment优点:

(1)模块化(Modularity):不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。

(2)可重用(Reusability):多个Activity可以重用一个Fragment。

(3)可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,获得更好的用户体验。

Fragment生命周期:

Fragment 的生命周期如图所示,关于每个方法的解释如下:

 

 

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解除关联时调用。

上面的方法中,只有OnCreateView()在重写时不用写super方法,其他都需要。

Fragment使用方法:

在Activity中添加Fragment的方式有两种:

(1)静态添加:通过xml的方式添加,即在布局页面中直接添加,缺点是一旦添加就不能在运行时删除。

(2)动态添加:在Activity中添加,运行时添加,这种方式比较灵活,建议使用这种方式。

注:基础实战参考博文:Android Fragment完全解析,Android Fragment的用法,手把手基础的Fragment用法,上手容易。

如果想深入了解Fragment的背后运行机制,可以参考这篇博文《Android Fragment 非常详细的一篇》,内部运行机制讲的很详细。

 

(孤山不见蓬莱客,点点星云落九洲)

转载于:https://www.cnblogs.com/weijuanran/p/Fragment.html

相关文章:

  • docker 非root用户修改mount到容器的文件出现“Operation not permitted
  • Python入门
  • SSL虚拟主机
  • 【.Net】 C#访问修饰符
  • 年薪 40W Java 开发在阿里是什么水平?
  • 书籍购买
  • raise 与 raise ... from 的区别
  • iOS开发之APP内部切换语言
  • Thanos如何让Prometheus更易用?
  • Spring任务调度之Spring-Task
  • P5112 FZOUTSY
  • java B2B2C springmvc mybatis多租户电子商城系统- 路由定位器
  • linux对vxlan的支持
  • Mysql优化
  • 3.1Python的判断选择语句
  • Apache Zeppelin在Apache Trafodion上的可视化
  • ES6--对象的扩展
  • Just for fun——迅速写完快速排序
  • laravel5.5 视图共享数据
  • QQ浏览器x5内核的兼容性问题
  • SQLServer之创建数据库快照
  • 从0到1:PostCSS 插件开发最佳实践
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 分布式事物理论与实践
  • 理清楚Vue的结构
  • 前端技术周刊 2019-02-11 Serverless
  • 使用API自动生成工具优化前端工作流
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 微信小程序填坑清单
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 小李飞刀:SQL题目刷起来!
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 带你开发类似Pokemon Go的AR游戏
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • # 达梦数据库知识点
  • $.ajax()参数及用法
  • (java)关于Thread的挂起和恢复
  • (poj1.3.2)1791(构造法模拟)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (六)Hibernate的二级缓存
  • (排序详解之 堆排序)
  • (已解决)什么是vue导航守卫
  • .NET Core 版本不支持的问题
  • .Net Memory Profiler的使用举例
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .Net组件程序设计之线程、并发管理(一)
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ 蓝桥杯Web真题 ]-布局切换
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]
  • [C语言]——C语言常见概念(1)