Fragment的使用

来源:互联网 发布:大数据产品经理笔试题 编辑:程序博客网 时间:2024/05/01 12:15

        Fragment语义是碎片,片段的意思,在android中是一个很有用的类。

        Fragment必须要依附于一个Activity,同时Fragment可以启动另外一个Activity,可以包含其他Fragment,最重要的是Fragment可以动态加载。其实总的来说Fragment的功能基本与Activity一致,只是较之Activity更加简洁而已。而且Fragment与其所依附的Activity之间是可以交互的。

        自定义Fragment。这里需要注意Fragment的构造器不可以有参数,但是可以通过setArguments(Bundle)的方法传参,在通过getArguments()得到参数。同时Fragment有几个重要的生命周期方法onAttach(Activity),onCreate(Bundle),onCreateView(Inflater,ViewGroup,Bundle),onViewCreated(View,Bundle)。常用的方法有getView(),startActivityForResult(),getFragmentManager(),getActivity(),getResources()等。

        onAttach()方法是最先调用的,我们可以在这里得到Fragment所依附的Activity,我们也可以使用getActivity()得到。

        onCreate()在onAttach()之后调用。

        onCreateView()虽然在onCreate()方法之后调用,但是却是最重要的,因为这里构造UI,当然如果使用在使用Activity.getFragmentManager().beginTransaction().add(Fragment,String)则不会调用onCreateView(),因为onCreateView是Fragment所在Activity的根View调用的。在这个方法里面,有三个参数,第一个参数LayoutInflater是用来加载XML文件的,因为LayoutInflater是一个抽象类需要使用LayoutInflater.from(Context)实例化一个对象,所以onCreateView()就自行提供了LayoutInflater作为参数。而第二个输入元素container则是Fragment的根View,需要XML文件依附于这个container,这样Fragment才可以通过自己的根元素得到自己的布局。而事实上,Activity使用的都是onCreateView()返回的View作为根元素,而Fragment.getView()也可以得到。onCreateView()返回的View将会添加到所在Activity的布局里面。

        这里使用LayoutInflater.inflate(layout,container,boolean)中,layout是Fragment的layout,container可以为空表示layout不依附在Fragment根元素上,但是最好使用onCreteView()的第二个输入参数作为container,然后返回的View将会作为Fragment的UI加载在Fragment所依附的Activity中,同时可以在onViewCreated()中得到返回的View。

        作为Activity,在自己的XML文件中,就可以直接拖曳一个Fragment放到XML文件中,然后系统会提示需要选择的Fragment进行加载。

        Activity使用FragmentManager,FragmentTransaction操作Fragment。使用getFragmentManager()得到FragmentManager管理Fragment,然后使用FragmentManager的方法findFragmentById(),findFragmentByTag()得到Fragment,使用beginTransaction()得到FragmentTransaction。使用FragmentTransaction操作Fragment,使用FragmentTransaction的方法add(Fragment,String)可以添加一个无UI的Fragment,这里必须要是动态添加,不然Activity的根View会调用Fragment的onCreateView(),会报错。使用add(containerViewId,Fragment)可以将Fragment添加到任意的View,方法的第一个参数就是任意View的Id。同时使用addToBackStack(String)可以tag为该方法输入参数的Fragmnet加到后台堆栈里。remove()方法可以删除Fragment。replace(containerViewId,Fragment)方法需要注意,这个方法删除掉containerViewId所有的Fragment,然后加进一个Fragment。

        注意getFragmentManager().beginTransaction().XX()之后必须要使用commit()方法才可以,不然无效,但是在一段代码里面只能使用一次commit()方法,不然就出错,这点需要注意。

        最后注意Fragment有两套体系,一套位于android.support.v4.app.Fragment,一套位于android.app.Fragment。前者是较早的Fragment所以在使用上有较多限制,在XML静态加载时,需要FragmentActivity才可以使用<fragment>标签,而后者没有。但是后者却需要较高的版本号。但是两者在方法的使用上基本都是对应的。

        所以,总的来说,Fragment可以实现XML文件静态加载,又可以实现动态加载。






0 0
原创粉丝点击