Fragment的了解和使用

来源:互联网 发布:微信朋友圈广告 知乎 编辑:程序博客网 时间:2024/05/18 05:03

Fragment的作用::统一管理一部分布局

1.fragment可以理解为是activity的一部分.

2.在一个activity当中使用多个fragment来构建UI

3.可以复用一个fragmeng在多个activity中使用

4.fragment有它自己的生命周期

5.一个fragment必须总是嵌入到activity中,生命周期受activity影响

6.当activity处于失去焦点的时候(Pause), fragment也会处于失去焦点的状态

7.fragment存活于ViewGroup当中


Fragment的生命周期

[1]使用Fragment必须重写onCreateView方法
[2]还可以重写一个ondestroy方法 做一些收尾的工作
● onStart:当到OnStart()时,Fragment对用户就是可见的了。但用户还未开始与Fragment交互。在生命周期中也可以看到Fragment的OnStart()过程与Activity的OnStart()过程是绑定的。意义即是一样的。以前你写在Activity的OnStart()中来处理的代码,用Fragment来实现时,依然可以放在OnStart()中来处理。
● onResume:当这个fragment对用户可见并且正在运行时调用。这是Fragment与用户交互之前的最后一个回调。从生命周期对比中,可以看到,Fragment的OnResume与Activity的OnResume是相互绑定的,意义是一样的。它依赖于包含它的activity的Activity.onResume。当OnResume()结束后,就可以正式与用户交互了。
● onPause:此回调与Activity的OnPause()相绑定,与Activity的OnPause()意义一样。
● onStop:这个回调与Activity的OnStop()相绑定,意义一样。已停止的Fragment可以直接返回到OnStart()回调,然后调用OnResume()。
● onDestroyView:如果Fragment即将被结束或保存,那么撤销方向上的下一个回调将是onDestoryView()。会将在onCreateView创建的视图与这个fragment分离。下次这个fragment若要显示,那么将会创建新视图。这会在onStop之后和onDestroy之前调用。这个方法的调用同onCreateView是否返回非null视图无关。它会潜在的在这个视图状态被保存之后以及它被它的父视图回收之前调用。
● onDestroy:当这个fragment不再使用时调用。需要注意的是,它即使经过了onDestroy()阶段,但仍然能从Activity中找到,因为它还没有Detach。
● onDetach:Fragment生命周期中最后一个回调是onDetach()。调用它以后,Fragment就不再与Activity相绑定,它也不再拥有视图层次结构,它的所有资源都将被释放。


fragment布局的加载和定义:

1.通过布局加载(基本不怎么用)
在主activity的布局文件中通过标签来定义fragment的样式,然后单独定义一个自己需要的具体的fragment布局的细节xml文件,在主xml中通过引入,然后在具体的类中通过继承Fragment类进行加载刚才定义好的xml布局,里面覆写onCreateView方法。
//name属性 要指定我们自己定义的fragment

2.通过在代码中动态加载


使用fragment兼容低版本的写法

[1]定义fragment继承V4包中的Fragment
[2]定义的activity要继承v4包中的FragmentActivity
[3]通过这个方法getSupportFragmentManager 获取Fragment的管理者


Fragment的静态和动态的使用

静态的使用方式:
①以xml布局形式自定义需要的fragment的样式
②然后通过自定义类继承Fragment,覆写onCreateView()方法,在里面渲染刚才自定义的 fragment布局,那么当前这个自定义的类就是一个Fragment,
③然后在main_layout.xml布局中需要使用这个fragment的时候,直接在main_layout.xml布局文件中通过标签加入一个fragment 控件,用name属性指向刚才的自定义Fragment类(例如下面的xml代码),那么Mainactivity中就会有一个fragment

<fragment    android:id="@+id/frag1"     android:name="com.example.sj.fragmentdemo1.Fragment1"     android:layout_width="match_parent"     android:layout_height="200dp"/>

动态的使用方式:
①以xml布局形式自定义需要的fragment的样式
②然后通过自定义Fragment类,和静态的使用方式前面一样,通过覆写onCreateView()方法加载刚才自定义好的fragment的xml布局。那么当前的这个Fragment类就是一个可以使用的Fragment控件。
③在主函数对应的xml布局文件中添加一个作为目标位置,用来将自定义好的Fragment对象添加到该控件上显示出来
④在MainActivity中实例化刚才自定义的Fragment自定义类,并且需要FragmentManager mFragmentManager= this.getFragmentManager(),然后通过管理器来开启一个事物FragmentTransaction transaction = mFragmentManager.beginTransaction();
⑤在开启了一个事物后,可以进行一些具体的事物操作,事物包含了下面知识点4中的那些操作
⑥通过事物,把实例化出来的Fragment对象添加(或者其他操作)到主函数xml布局中的位置
参数内容: transaction.add(R.id.目标位置,Fragment对象,唯一的标识);
transaction.add(R.id.des,mFragment2,”xx2”);
transaction.add(R.id.des,mFragment3,”xx3”);
ransaction.add(R.id.des,mFragment1,”xx1”);
⑦提交事物。 transaction.commit();


动态添加Fragment主要分为4步:

● 1.获取到FragmentManager,在V4包中通过getSupportFragmentManager,在系统中原生的Fragment是通过getFragmentManager获得的。
● 2.开启一个事务,通过调用beginTransaction方法开启。
● 3.向容器内加入Fragment,一般使用add或者replace方法实现,需要传入容器的id和Fragment的实例。
● 4.提交事务,调用commit方法提交。


事物管理

add 将Fragment对象添加到指定位置(不能重复添加)
remove 将Fragment对象从指定位置移除,此操作将会销毁Fragment对象的结构和视图
replace 替换 效果=remove+add
hide 将当前Fragment对象隐藏,Fragment对象依旧存在
show 让隐藏重现
detech 销毁视图结构 : 一方面删除fragment的View视图;一方面将fragment从Activity的ADD队列中移除
attech 重构视图结构 :重新构建了fragment的View视图,并且将fragment添加到了ADD队首位置

add remove 与 hide和show attech和detech间的区别

他们都能实现看得见—>看不见—>看得见

性能消耗和内存处理上不同
remove 指的是完全销毁fragment对象的全部构造数据

hide 关于内存中的数据什么都不动,只是变得看不见了而已
detech 只是把视图部分销毁,其他数据还在


Fragment的管理:

1.FragmentManager

要管理activity中的fragments,你就需要使用FragmentManager。通过getFragmentManager()或 getSupportFragmentManager()获得
常用的方法有:
manager.findFragmentById(); //根据ID来找到对应的Fragment实例,主要用在静态添加fragment的布局中,因为静态添加的fragment才会有ID
manager.findFragmentByTag();//根据TAG找到对应的Fragment实例,主要用于在动态添加的fragment中,根据TAG来找到fragment实例
manager.getFragments(); //获取所有被ADD进Activity中的Fragment

通过Tag去找到对应的Fragment实例,然后进行具体的操作管理:
隐藏hide:

FragmentManager manager = getSupportFragmentManager();  Fragment fragment = manager.findFragmentByTag("fragment3");  FragmentTransaction transaction = manager.beginTransaction();  transaction.hide(fragment);  transaction.addToBackStack("hide fragment3");  transaction.commit(); 

展示show:

FragmentManager manager = getSupportFragmentManager();  Fragment fragment = manager.findFragmentByTag("fragment3");  FragmentTransaction transaction = manager.beginTransaction();  transaction.show(fragment);  transaction.addToBackStack("show fragment3");  transaction.commit();

2、FragmentTransaction

一般用来对当前的Fragment进行管理,包括add,replace,remove;
常用的针对Fragment的方法有:

//将一个fragment实例添加到Activity的最上层
add(int containerViewId, Fragment fragment, String tag);

//将一个fragment实例从Activity的fragment队列中删除
remove(Fragment fragment);

//替换containerViewId中的fragment实例,注意,它首先把containerViewId中所有fragment删除,然后再add进去当前的fragment
replace(int containerViewId, Fragment fragment);


Fragment的回退栈操作

通过一个Fragment对象上的按钮事件去开启另外一个Fragment,该按钮的功能需要在它存在的Fragment对象中去实例化并且添加点击事件,操作如下:

FragmentManager fragmentManager = this.getFragmentManager(); //获取Fragment管理器
FragmentTransaction transaction = fragmentManager.beginTransaction(); //开启一个事物
transaction.add(R.id.root_layout,new Fragment2(),”xx1”); //将Fragment2对象添加到显示位置(因为显示位置定义的是帧布局,所以后添加的会挡住前面添加的)

transaction.addToBackStack(null); //加入回退栈,只有添加了这行命令,在点击back键的时候才会返回到之前的Fragment界面位置,才不会直接将程序onDestroy。
transaction.commit(); //提交事物

0 0
原创粉丝点击