Android编程权威指南--CriminalIntent笔记及拓展(二)

单例模式

这里写图片描述
优点:
1. Android开发常用到单例的一大原因是,它们比fragment或activity活得更久,如在设备旋转或者fragment和activity间跳转的场景下,单例不会受到影响,而旧的fragment或activity已经不存在了.
2. 单例能方便的存储控制模型层对象.
缺点:
1. 虽然活的更久,但是并不代表可以永存,我们切换至其他应用,又逢android回收内存,单例连同那些实例变量就不复存在了
2. 单例还不利于单元测试.

布局参数

  1. 不以layout_开头的属性作用于组件,组件实例化时,会调用某个方法按照属性及属性值进行自我配置.
  2. 以layout_开头的属性则作用于组件的父组件.我们将这些属性统称为布局参数,他们会告诉父布局如何在内部安排自己的子元素
  3. 我们用16dp单位值设定边距尺寸,该单位值的设定遵循了Android的material设计原则,不过这些设计原则严重依赖于SDk较新版本的功能,有些可以通过AppCompat库获得支持

RecyclerView

  1. RecyclerView类的任务就是回收再利用以及定位.
  2. 实际上,定位的任务被委托给了LayoutManager.除了在屏幕上定位列表项,LayoutManager还负责定义屏幕滚动行为,因此没有LayoutManager,RecylerView也就没法正常工作了.
  3. notifyItemChanged(int)通知条目会有动画,notifyDateSetChanged()全部通知.
  4. ViewHolder.getAdapterPosition()
  5. RecycleView item监听的实现,在ViewHolder创建的时候添加监听(实现OnClickListener)
    这里写图片描述

Fragment Arguments

这里写图片描述
1. CrimeActivity中封装了一个newInstanceIntent(context, UUID)方法,CrimeListFragment中调用
2. 可以直接在CremeFragment中,用getIntent得到里面的UUID数据,但是这样破坏了Fragment的封装性,CrimeFragment不再是可复用的构建单元,因为它现在由某个特定的activity托管
3. 较好的写法应是在crime ID存储在属于CrimeFragment的某个地方,而不是保存在CrimeActivity的私有空间里.这样,无需依赖于CrimeActivity的intent内指定的extra的存在,CrimeFragment就能获取自己所需的extra数据.属于fragment的”某个地方实际就是它的argument bundle”
这里写图片描述
这里写图片描述
4. Activity和fragment不需要也无法同时相互保持独立性,activity必须了解fragment的内部结构,比如知道它内部有个newInstance(UUID)方法,这很正常,托管activity应该知道这些细节,以便托管fragment,但fragment不一定要知道其托管activity的细节问题
为什么选择覆盖onResume()方法来刷新列表项显示,而不用onStart()方法?
1. 如果前面的activity是透明的,或者对话框
这里写图片描述

应用对象图解

这里写图片描述

为何要用fragment argument

Fragment argument的使用还有有点复杂,为什么不直接在CrimeFragment,里创建一个实例变量呢?
创建实例变量的方式并不可靠,因为,操作系统重建fragment时,设备配置发生改变时,用户暂时离开当前应用时,甚至操作系统按需回收内存时,任何实例变量不复存在了,尤其是内存不够,杀掉应用的情况,可以说你无人能挡.
因此,可以说,fragment argument就是为应对上述场景而生
还有另一个应对上述场景,就是实例状态保存机制,onsaveInstanceState(Bundle)方法,
然而,这种解决方案维护成本高,若干年后,再回头修改老代码,只需一眼就知道,crime id是以argument保存和传递使用,而很可能忘记在onSaveInstanceState(Bundle)方法里保存下来

零散知识点

  1. 尽管fragment有自己的statrtActivityForResult()和onActivityResult()方法,但却没有setResult方法,要用activity中的setResult方法
  2. DateFormat.getTimeFormat(this).format(new Date());时分
    DateFormat.getDateFormat(this).format(new Date());年月日
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值