Fragment实例

来源:互联网 发布:centos yum 网卡驱动 编辑:程序博客网 时间:2024/06/14 12:10


参考自 http://blog.csdn.net/flowingflying/article/details/12505453 系列八篇文章

很详细,在这总结一些自己需要的

一,关于生命周期


因为Fragment有两种引入方式,两种引入方式生命周期不尽相同(这里主要比较的是开启Fragment时的不同)

1,由布局文件xml中指定类名称而引入Fragment
生命周期为:

activity:oncreate->setContentView->                                                                     ->setContentView->oncreate                         

fragment:                                       onInflate->onAttach->onCreate->onCreateView                                          ->onActivityCreate->onStart->onResume


注:setContentView为oncreate中的,首尾的setContentView和oncreate分别代表其开始和结束 


2,另外一种是在Fragment类中代码引入Fragment
生命周期为:
fragment:onAttach-->onCreate-->onCreateView-->onActivityCreate-->onStart-->onResume


不同之处:1,引入方式2中就没有onInflate方法了

                 2,引入方式2的fragment生命周期与activity没有关系了

                 3,引入方式1的setContentView的开始和结束,oncreate的结束分别为fragment生命周期的三个切割点



从程序的运行输出也可以看出activity和fragment的生命周期了



完整的activity和fragment的生命周期的对比



二,关于两种引入fragment的方法

1,由布局文件xml中指定类名称而引入Fragment(把android:name替换为class也可以)

<fragment android:name="com.wei.flowingflying.pro.ProFragment.TitleFragment"        android:id="@+id/titles"         android:layout_width="match_parent"        android:layout_height="match_parent" />
2,另外一种是在Fragment类中代码引入Fragment

一般在Fragment类的onCreateView中引入

//注意,我们并不需要在代码中将子容器(引入的详情view)放入FrameLayout(container)中,系统会自动完成,如果我们将两者关联,反而会出现异常。@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stubshowInfo("onCreateView() is called.." + getActivity());showInfo("   container is " + container);//即第三个参数置为false,不让详情view和container关联起来View v = inflater.inflate(R.layout.details, container,false);TextView tv = (TextView)v.findViewById(R.id.text1);tv.setText(BooksInfo.TITLES[mIndex] + "\n\n" +BooksInfo.DIALOGUE[mIndex]);showInfo("   return  " + v);return v;}

三,fragment参数传递

在当前fragment传递参数可以直接使用setArguments(bundle)和getArguments()获取bundle

在当前fragment设置或获取其他fragment或activity的参数,需要new fragment再fragment.setArguments(bundle)和fragment.getArguments()

                Bundle b = getArguments();if(b != null){mCurCheckPosition = b.getInt("index", -1);showInfo("  arg : index " + mCurCheckPosition);}else{b = new Bundle();b.putInt("index", mCurCheckPosition);setArguments(b);}

四,一些有关于fragment的方法

1,添加Fragment的方法

fragmentTransaction.add(R.id.fragment_container, fragment); 

fragmentTransaction.commit();

add()的第一个参数是fragment要放入的ViewGroup,由resource ID指定, 第二个参数是需要添加的fragment,一旦FragmentTransaction做了改变,为了使改变生效,必须调用commit()


2,替换Fragment的方法

fragmentTransaction.replace(R.id.fragment, fragment); 

replace()的两个参数分别是原fragment的id和新的fragment


3,加入BackStack的方法(加入堆栈中,相当于添加到activity的界面管理器中)


addToBackStack(tag)

如果是add方法则加入到堆栈的是新的fragment,如果是replace方法则是原fragment

把Fragment添加到BackStack后,点击返回时就会回到上一个显示的Fragment

如果不添加就直接退出了activity


                DetailFragment detail = DetailFragment.newInstance(index);FragmentTransaction ft = getFragmentManager().beginTransaction();ft.replace(R.id.details, detail);ft.addToBackStack("detail");ft.commit();

实例代码(主要是多了些注释)http://download.csdn.net/detail/superjunjin/8554121

原文章代码 http://blog.csdn.net/flowingflying/article/details/12505453 

另外:代码实现了官方文档的效果,关于横竖屏切换的,横屏显示title和detail 竖屏为只显示title 点击title再显示详情效果(看代码注释或原文章就懂了)


另外两个例子的代码也放这了

http://download.csdn.net/detail/superjunjin/8536659

http://download.csdn.net/detail/superjunjin/8536759

0 0