前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Android编程权威指南》之UI fragment与fragment管理器

《Android编程权威指南》之UI fragment与fragment管理器

作者头像
用户8928967
发布2021-10-13 11:50:48
5170
发布2021-10-13 11:50:48
举报
文章被收录于专栏:用户8928967的专栏

开始开发 CriminalIntent 应用啦!

一、UI设计的灵活性需求

理论上该应用会由两个页面组成,一个负责管理记录列表界面,另一个负责管理记录明细界面。

然后呢,由于有平板的存在,对于平板的屏幕尺寸来说,为了适配它,这两个页面可以显示在一屏中。

UI

为了适配手机和平板设备的两种不同的 UI 结构,接下来就要学习新的知识点啦!🆙

二、引入fragment

fragment 是一种控制器对象,activity 可委派它执行任务,它可以让应用更具有灵活性。

它有自己的视图(由布局文件实例化而来),视图包含了用户可以交互的可视化UI元素。

activity视图可以提供多个位置给fragment,也就是一个activity里面可以含有多个fragment。

一些新的Android Jetpack API,比如导航控制器(navigation controller),就能完美地支持fragment。(真是学无止境呢~)

官方有关 Fragment 的介绍参考:

https://developer.android.com/jetpack/androidx/releases/fragment

三、着手开发CriminalIntent

当然就是创建新项目,创建需要的各种类。书中的图参考理解一下该项目的层级结构,然后就是自行实践敲代码。

MainActivity托管着CrimeFragment

CriminalIntent应用的对象图解

四、创建Crime数据类

代码语言:javascript
复制
/**
 * Crime 陋习实体类
 *
 * @property id
 * @property title
 * @property date
 * @property isSolved
 * @constructor Create empty Crime
 */
data class Crime(
    val id: UUID = UUID.randomUUID(),
    var title: String = "",
    var date: Date = Date(),
    var isSolved: Boolean = false
)

UUID是Android框架里的工具类,用来生成唯一ID。date 默认当前日期。

五、创建UI fragment

  • 首先,把 CrimeFragment 的布局写好,照着敲一遍的啦!具体代码参考结尾处 Github地址。
    1. 定义UI布局文件

预览

  • 接下来就是创建 CrimeFragment 类,它是继承了 Fragment,使用用 Jetpack 库版 Fragment。 fragment是在API 11级系统版本中引入的,为了支持老设备,一个兼容版的Fragment实现被添加到v4支持库版本中,Android 9.0(API 28)的发布后,系统框架版的 fragment 就被弃用了,早期支持库版本的fragment也全部被迁移到了Jetpack库中,以后也只对 Jetpack 库版 Fragment 进行升级了,因此,早点迁移吧!
    1. 创建fragment类并设置其视图为第一步定义的布局
  • 然后就照着编写 CrimeFragment 代码,新建 Crime 实例。拿到控件,给控件添加监听器什么的。 一定要敲一遍代码,理解一些代码逻辑的具体用意。
    1. 编写代码以实例化部件

六、托管 UI fragment

意思就是 activity 在其布局中为 fragment 的视图安排位置,并管理 fragment 实例的生命周期。

定义容器视图

activity_main.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/flayout_fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
向FragmentManager中添加UI fragment

FragmentManager 类负责 fragment 视图添加到 activity 中,具体会管理 fragment 队列和 fragment 事务回退栈。

FragmentManager图解

代码语言:javascript
复制
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val currentFragment = supportFragmentManager.findFragmentById(R.id.flayout_fragment_container)
        if(currentFragment == null){
            val crimeFragment = CrimeFragment.newInstance()
            // add 的参数是容器视图资源ID和新创建的CrimeFragment。
            supportFragmentManager.beginTransaction()
                .add(R.id.flayout_fragment_container, crimeFragment)
                .commit()
        }
    }
}

fragment 事务被用来添加、移除、附加、分离或替换 fragment 队列中的fragment。

val currentFragment = supportFragmentManager.findFragmentById(R.id.flayout_fragment_container) 这行代码的缘由:

设备旋转或回收内存时,Android系统会销毁MainActivity,而后重建时,会调用MainActivity.onCreate(Bundle?)函数。activity被销毁时,它的FragmentManager会将fragment队列保存下来。这样,activity重建时,新的FragmentManager会首先获取保存的队列,然后重建fragment队列,从而恢复到原来的状态。

FragmentManager与fragment生命周期

如图所示:

fragment生命周期

activity的生命周期函数由操作系统负责调用,而fragment的生命周期函数由托管activity的FragmentManager负责调用。

添加 fragment 供 FragmentManager 管理时,onAttach(Context?)、onCreate(Bundle?)和onCreateView(...)函数会被调用。

向处于运行状态的 activity 中添加 fragment 时,以下 fragment 生命周期函数会被依次调用:onAttach(Context?)、onCreate(Bundle?)、onCreateView(...)、onViewCreated(...)、onActivityCreated(Bundle?)、onStart()以及onResume(),当 fragment 的快速同步上 activity 最新的生命周期状态的后,托管activity的FragmentManager就会边接收操作系统的调用指令,边调用其他生命周期函数,让 fragment与activity保持步调一致。

七、采用fragment的应用架构

fragment 的本意是封装关键部件以方便复用,实践证明,应用单屏最多使用2~3个 fragment。

当然,简单的应用,就可以不必使用它啦,对于复杂的应用,那还是有必要使用的,记住合理使用就OK啦!

八、其他

具体代码 Demo 地址:https://github.com/visiongem/AndroidGuideApp/tree/master/CriminalIntent

🌈关注我吖~❤️

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 妮K妮K妮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、UI设计的灵活性需求
  • 二、引入fragment
  • 三、着手开发CriminalIntent
  • 四、创建Crime数据类
  • 五、创建UI fragment
  • 六、托管 UI fragment
    • 定义容器视图
      • 向FragmentManager中添加UI fragment
        • FragmentManager与fragment生命周期
        • 七、采用fragment的应用架构
        • 八、其他
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档