Android Fragment总结

来源:互联网 发布:淘宝特卖女装套装 编辑:程序博客网 时间:2024/06/05 14:21


理解:Fragment,故名思议,就是Activity的片段,或者说是Activity的零部件。有自己独立的生命周期,有自己的界面,自己的交互控制逻辑,像积木一样可以被Activity自由地搭配使用。        好处有二,一是便于代码管理,二是便于 相应功能的拼装 和复用。

Fragment和Activity的关系,简单来说,就是Fragment寄生于Activity,母体一死,寄生虫全完。寄生虫的生命周期受宿主的影响。
(而且为了兼容Android3.0之前的版本,最好将它寄生于FragmentActivity。
参考:FragmentActivity和Activity的具体区别在哪里 - wanqi - 博客园)

对于Fragment整体上的理解,可参考:
Android--Fragment你应该明白的一些疑难点
Fragment与Activity生命周期的相互影响,可参考:
一句话、一张图记住Activity和Fragment之间错综复杂的生命周期关系 - 综合编程类其他综合 - 红黑联盟
Activity与Fragment的生命周期 - 让我们一起异想天开 - CSDN博客


&&.要点如下:
1.根据自己的需要来设计显示方式:
或者统统add上,隐藏不需要显示的,显示需要的,不断切换;
或者通过replace(),每次通过替换来显示,其实质是先remove()再add()。
2.Fragment分两类:java代码中动态生成、xml静态写好。
3.Activity可以管理Fragment的一个回退栈,通过把之前不需要显示的Fragment加入此栈,可以实现点击返回键时依次回退,知道退到栈底,然后退出应用。
4.FragmentActivity中与Fragment的交互示例如下:
    FragmentManager fragmentManager = getFragmentManager();//获取FragmentActivity的Fragment管理器对象
    FragmentTransaction transaction = fragmentManager.beginTransaction();//获取Fragment事务管理对象


&&.数据交互:
1.Activity to Fragment:
Activity向Fragment传递参数:fragment.setArguments( Bundle对象 );
Fragment中取出参数:getArguments();

2.Fragment to Activity/Fragment:
Fragment中可获取到父Activity:getActivity();
然后,一切向外投放的数据,都可以通过父Activity这条路来做。


&&.简单代码示例:
Fragment fragment = findFragmentById( R.id.XXXX );//xml中对Fragment定义的ID
fragment.setArguments( Bundle对象 );//在Fragment类代码中,可用getArguments()取出该Bundle对象

FragmentTransation transation = getFragmentManager().beginTransation();
transation.replace( 容器View,  fragment );
transation.commit();

//在Fragment对象的代码中,可用以下方法获取该对象添加到的Activity
getActivity();


&&.其它注意点:
1.一般出现State loss这样的错误。主要是因为:commit方法一定要在Activity.onSaveInstance()之前调用。(but why???????)


&&. 常用api无外乎如下:
android.app.Fragment 主要用于定义Fragment
android.app.FragmentManager 主要用于在Activity中操作Fragment
android.app.FragmentTransaction 保证一些列Fragment操作的原子性,熟悉事务这个词,一定能明白~
a、获取FragmentManage的方式:
getFragmentManager() // v4中,getSupportFragmentManager
b、主要的操作都是FragmentTransaction的方法
    FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
1.transaction.add(view容器,fragment) 
    往Activity中添加一个Fragment,fragment对象会与Activity相关联,触发onAttach()一直到onResume();
2.transaction.remove(fragment)
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
    会触发onPause()一直到onDettach();
3.transaction.replace(view容器,fragment)
使用另一个Fragment替换当前显示的fragment,实际上就是remove()然后add()的合体~
4.transaction.hide(fragment)
    隐藏指定的的Fragment,仅仅是设为不可见,对fragment的生命周期无影响。
5.transaction.show(fragment)
显示之前隐藏的指定Fragment,仅仅是显示,对fragment生命周期无影响。
6.transaction.dettach(fragment)
    会将fragment从Activity的view树中移除, fragment的view会被销毁,因此会触发fragment生命周期中的  onPause()一直到onDestroyView(), 但fragment的状态仍然由Activity的FragmentManager维护着,fragment还没有从Activity中解除关联。
    与remove()不同,fragment此时还没有跟Activity解除关联,因此不会触发onDettach()
7.transaction.attach(fragment)
    将之前dettach()的fragment重新attach()上,fragment对象会重新被添加到Activity的view树上,fragment的view会被重建,因此会触发fragment生命周期中的  onCreateView()一直到onResume().
    与add()不同,fragment并未与Activity重新建立关联,仅仅是UI的重新生成,因此不会触发onAttach()、onCreate()。
8.transaction.commit()
    提交一个事务。

上述API方法对于Fragment生命周期的影响,可参考:
FragmentTransaction与Fragment生命周期的关系 - 食用淡水鱼 - SegmentFault


相关参考:
         Android Fragment 真正的完全解析(上) - Hongyang - 博客频道 - CSDN.NET
         Android Fragment 真正的完全解析(下) - Hongyang - 博客频道 - CSDN.NET     
         Android Fragment 你应该知道的一切 - Hongyang - 博客频道 - CSDN.NET
原创粉丝点击