首先感谢鸿洋大神的谆谆教诲.鸿洋大神是我永恒的偶像,膜拜一下先.想详细了解的请走传送门 http://blog.csdn.net/lmj623565791/article/details/37970961
先说一下我对fragment的理解.
fragment ,碎片 可以理解为,项目是一个一个文件堆的,文件是一个一个碎片堆得
可以看做一个高级的自定义控件,高级在控件的内容可以被替换,并像Activity那样有个栈,可以回退操作.哪里想用放哪里,妈妈再也不用担心我粘错代码
用来解耦,解放activity,避免一个activity 1000+行代码哪都不敢碰的尴尬.
灵活性,可读性,可复用性大大提高, 堪比重构项目
小白总结:fragment可以看做是在布局中定义一个控件,名叫fragmentlayout, 然后在activity中填充进去内容,fragmentA,比自定义控件牛逼之处在于,还可以将fragmentA替换成fragmentB,然后点击后退键,唉呀妈呀,
又回到fragmentA
下面老师要画重点了,几乎都是必考的.难易程度与考的可能性成负相关
fragment生命周期 简单
回退栈, 难
与activity 的交互 中等
常用方法 简单
后台运行的缺陷 装逼
小白们记住,代码是给人写的,不是给机器写的,你写完,功能完成了,不说别人看不懂,你自己都看不懂.... :) 碰见愿意改需求的SB用户,你就SB了.---年迈的程序员
好,下面开始天下文章一大抄,抄来抄去有提高.
常问问题及一句话解答:
activity 和fragment 的交互
记住倆方法:getActivity findFragmentByTag||findFragmentById
因为所有的Fragment都是依附于Activity的,所以通信起来并不复杂,大概归纳为:
a、如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
b、如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
c、在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。
注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。
Fragment的生命周期
上图:
先背下来就行.之后再理解,着急就不用理解了,但是一定要背下来
可以看到Fragment比Activity多了几个额外的生命周期回调方法:
onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现,
fragment 的常用方法及辨析:
remove 会销毁视图,hide不会
.add()
.remove() 会销毁视图
.replace() =remove + add
.hide() 不会销毁视图
.show()
fragment 回退栈
类似于activity栈,如果fragment不加入回退栈,fragmentA,被fragmentB替换后,A的实例会被干掉,点击goback建不会回到A.fragment栈清空之后,再点回退键,才会调用activity栈,回退activity
后台运行缺陷:
在后台时,由于生命周期重合,所以,oncreat时会重绘fragment,导致重合,解决办法是只有在savedInstanceState==null时,才进行创建Fragment实例
当你的应用被至于后台(例如用户点击了home),长时间没有返回的时候,你的应用也会被重新启动。例:如果你把至于FragmentB界面,然后处于后台状态,长时间后你会发现当你再次通过home打开时,上面FragmentA与FragmentB叠加在一起,这就是因为你的Activity重新启动,在原来的FragmentB上又绘制了一个FragmentA。
解决方法:
通过检查onCreate的参数Bundle savedInstanceState就可以判断,当前是否发生Activity的重新创建:
默认的savedInstanceState会存储一些数据,包括Fragment的实例,只有在savedInstanceState==null时,才进行创建Fragment实例