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

第7章了,整本书最复杂的项目开始了,CriminalIntent,这个项目可有13章篇幅,厉害了呀!还有挑战练习,好多好多喔~~~ 自己挖的坑,一定要填完才行呐!!!

同样,书中的项目代码就懒得贴来了,照着敲一遍总是有好处的,主要是知识点,然后在此基础上做做练习题。

引入 fragment

由于一些多变的UI设计,activity实现不灵活,于是有了fragment,用来实现UI更为灵活。

fragment 是一种控制器对象,activity可委派它执行任务。它的视图包含了用户可以交互的可视化UI元素。activity视图可以提供多个位置给fragment,也就是一个activity里面可以含有多个fragment。

fragment在API 11级系统版本中引入,为平板这样的大屏幕设备设计。

Google有两个版本的fragment实现可供选择:原生版本(实现内置在设备系统中,不同设备上可能会有不同的表现 android.app)和支持库版本(在类库里,建议使用 android.support.v4.app)。

截图取自此书

着手开发 CriminalIntent

设计理解图(CrimeActivity托管着CrimeFragment):

截图取自此书
本章项目完成图解:

截图取自此书
接下来,照着敲代码呗~ 更有印象,更易理解。

在模块的build.gradle 引入依赖项

implementation 'com.android.support:appcompat-v7:26.1.0'

部分的依赖项字符串使用了Maven坐标模式:
groupId(类库的基础包名,能唯一标识Maven仓库中的依赖类库):artifactId(包中的特定库名,这里指定的是appcompat-v7): version(类库的版本号)
Maven是一个依赖包管理工具,详见其官方网站 https://maven.apache.org/

托管 UI fragment

activity必须在其布局中为fragment的视图安排位置并管理fragment实例的生命周期。

fragment生命周期图解(fragment的使用是activity内部的事情):

截图取自此书
托管的两种方式

  • 在activity布局中添加fragment
    不够灵活,将fragment及其视图与activity的视图绑定在一起了。
  • 在activity代码中添加fragment
    可动态控制fragment,更复杂一点。

代码走起。
在activity视图层级结构中为fragment视图安排位置。
FrameLayout是服务于CrimeFragment的容器视图。注意该容器视图是个通用性视图,不单单用于CrimeFragment类,还可以用它托管其他的fragment。

创建 UI fragment

  1. 定义用户界面布局文件
  2. 创建fragment类并设置其视图为定义的布局(导入支持库版的Fragment)
  3. 编写代码以实例化组件

继续照着敲一遍代码理解fragment生命周期。

  • Fragment.onCreate(Bundle)是public方法,而Activity.onCreate(Bundle)是protected方法。Fragment生命周期方法必须是公共方法,因为托管fragment的activity要调用它们。
  • fragment同样具有保存及获取状态的bundle,可根据需要覆Fragment.onSaveInstanceState(Bundle)方法。
  • fragment的视图是在 onCreateView()生命周期方法完成的,它将实例化的 View 返回给托管 activity,Bundle用来存储恢复数据,可供该方法从保存状态下重建视图。
@Override 
 public View onCreateView(LayoutInflater inflater, ViewGroup container, 
 Bundle savedInstanceState) { 
 View v = inflater.inflate(R.layout.fragment_crime, container, false); 
 return v; 
 } 
  1. 第一个参数:布局资源ID。
  2. 第二个参数:视图的父视图(为了正确配置组件)。
  3. 第三个参数:告诉布局生成器是否将生成的视图添加给父视图(传入了false参数,因为要以代码的方式添加视图)。

然后就是一些控件的获取以及处理的代码了。

向 FragmentManager 添加 UI fragment

FragmentManager(负责管理fragment并将它们的视图添加到activity的视图层级结构中的类)图解:

截图取自此书
FragmentManager类具体管理:

  1. fragment队列
  2. fragment事务回退栈
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
if (fragment == null){
      fragment = new CrimeFragment();
      fm.beginTransaction()
            .add(R.id.fragment_container, fragment)
            .commit();
}

FragmentManager.beginTransaction()方法创建并返回FragmentTransaction(支持流接口(fluent interface)的链式方法调用)实例。
上述代码解读:创建一个新的fragment事务,执行一个fragment添加操作,然后提交该事务。

add(...)方法是整个事务的核心,参数:

  1. 容器视图资源ID(告诉FragmentManager,fragment视图应该出现在activity视图的什么位置;唯一标识FragmentManager队列中的fragment)
    如需从FragmentManager中获取CrimeFragment,可使用容器视图资源ID——Fragment fragment = fm.findFragmentById(R.id.fragment_container);【使用容器视图资源ID识别UI fragment是FragmentManager的一种内部实现机制】
  2. 新创建的CrimeFragment

下面这段话有点重要,便于理解:

截图取自此书

向处于运行状态的activity中添加fragment时,以下fragment生命周期方法会被依次调用:onAttach(Context)、onCreate(Bundle)、onCreateView(...)、onActivityCreated (Bundle)、onStart()以及onResume()

采用 fragment 的应用架构

建议应用单屏最多使用2~3个fragment,建议使用fragment。

深入学习:fragment 与支持库

真正实现fragment功能的是support-v4库,可以在库中找到android.support. v4.app.Fragment的源码。

support-v4库里也有一个Activity子类:FragmentActivity。要使用支持库版fragment,应用的activity必须继承FragmentActivity。


截取自此书

由AppCompatActivity继承树可看出,AppCompatActivity是FragmentActivity的子类,所以,每次要使用Fragment,创建Acitivity继承AppCompatActivity也是可以的 ,不用改成为FragmentActivity。

深入学习:为什么优先使用支持库版 fragment

  1. 方便。(想升级支持库版fragment,只需下载升级包,重新编译发布一个新版本应用即可)(Google每年会多次更新支持库,并借此引入新特性、修复bug,可以享受此好处)
  2. 兼容低版本
截图取自此书

感觉学习Fragment篇,书中满满的干活在,还需要细细品尝!加油吧ヾ(◍°∇°◍)ノ゙

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,976评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,249评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,449评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,433评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,460评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,132评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,721评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,641评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,180评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,267评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,408评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,076评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,767评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,255评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,386评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,764评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,413评论 2 358

推荐阅读更多精彩内容