跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

Android Fragment(动态,静态)碎片详解及总结

Android Fragment(动态,静态)碎片详解一.Fragment的相关概念(一)Fragment的基础知识Fragment是Android3.0新增的概念,中文意思是碎片,它与Activity十分相似,用来在一个 Activity中描述一些行为或一部分用户界面.使用多个Fragment可以在一个单独的Activity中建 立多个UI面板,也可以在多个Activity中使用Fragment。

Fragment拥有自己的生命 周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为 重要的是,你可以动态的添加、替换和移除某个Fragment。

一个Fragment必须总是被嵌入到一个Activity中,它的生命周期直接被其所属的宿主Activity生 命周期影响,它的状态会随宿主的状态变化而变化。 要创建一个Fragment 必须创建一个Fragment的子类,或者继承自另一个已经存在的 Fragment的子类.并重写 onCreateView()方法加载UI。

(二)Fragment生命周期因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是 密切相关的。 如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状 态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有 Fragment都会被销毁。 但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除 Fragment。 当这样进行fragment transaction(转换)的时候,可以把fragment放入Activity的back stack中,这样用户就可以进行返回操作。

下面是Activity对象和Fragment对象的全部生命周期的对比图:

可以看到Activity有七个生命周期,Fragment有十一个生命周期。

(三)Fragment中几个重要的回调方法说明:1.onAttach(Activity)当Fragment与Activity发生关联时调用。

2.onCreateView(LayoutInflater, ViewGroup,Bundle) 创建该Fragment的视图3.onActivityCreated(Bundle)当Activity的onCreate方法返回时调用

4.onDestoryView()

与onCreateView相对应,当该Fragment的视图被移除时调用

5.onDetach()与onAttach相对应

当Fragment与Activity关联被取消时调用注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现,就是Super。。不能去掉。

(四)Fragment家族常用的API1.

Fragment常用的三个类:(1)android.app.Fragment主要用于定义(2)Fragment android.app.FragmentManager 主要用于在Activity中操作(3)Fragment android.app.FragmentTransaction 保证一些列Fragment操作的原子性,熟悉事务这个词, 一定能明白。

2.获取FragmentManage的方式:

(1)getFragmentManager()(2)getSupportFragmentManager //v4包中FragmentActivity 3.FragmentTransaction的操作和方法(1)开启一个事务FragmentTransaction transaction = fm.benginTransatcion();(2)往Activity中添加一个Fragment transaction.add()(3)从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。

transaction.remove()(4)使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体transaction.replace()(5)当你的fragment数量固定很少时隐藏当前的Fragment,仅仅是设为不可见,并不会销毁,多的时候可能出现OOM异常transaction.hide()(6)显示之前隐藏的Fragment transaction.show()(7)detach()会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentMa nager维护。(8)attach()重建view视图,附加到UI上并显示。(9)transatcion.commit()//提交一个事务上述,基本是操作Fragment的所有的方式了,在一个事务开启到提交可以进行多个的添加、 移除、替换等操作。

值得注意的是:如果你喜欢使用Fragment,一定要清楚这些方法,哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏,这样才能更好的使用它们。

比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望回到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,最好进行下非null判断。

再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace() 这个和remove,add是相同的效果。

remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个 Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用 detach。

二.Activity中添加Fragment(一)添加Fragment的两种方法1.方法一(Activity的布局文件中加入标签) 在XML中配置更加简单一点,但是灵活性不够,不能在同一个位置去切换多个不同的 Fragment

注意:

fragment必须设置id或者tag,并且需要指定name为类名。

这样使用就相当于把fragment当作一块布局来使用了!

2.方法二(使用FragmentTransaction的add()方法加入fragment)(1)获取到FragmentManager,在Activity中可以直接通过getFragmentManager得到。

FragmentManager fragmentManager = getFragmentManager();//这里要注意是否是V4包的(2)开启一个事务,通过调用beginTransaction方法开启。

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();(3)向容器内加入Fragment,一般使用add或者replace方法实现,需要传入容器的id和 Fragment的实例。

fragmentTransaction.replace(Activity设置的布局中的ViewGroup组件id,需要替换的Fragment实例);//也可以使用三参的方法,传递一个Tag(4)提交事务,调用commit方法提交。

fragmentTransaction.commit();(二)Fragment回退栈类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保 存每次Fragment事务发生的变化。如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity。 假设现在我们有两个Fragment:Fragment01和Fragment02,我们现在从Fragment01的界面跳到Fragment02,然后按Back键,发现程序是直接退出了,而不是返回到Fragment01。 如果现在想实现以下功能:从Fragment01的界面跳到Fragment02,然后按Back键,会返回到Fragment01,就需要加入回退栈了,FragmentTransaction中提供了一个 addToBackStack()方法,可以将一个事务添加到返回栈中。

1. transaction.add(R.id.right, rightFragment);2. transaction.addToBackStack(null);我们在事务提交之前调用了FragmentTransaction的addToBackStack()方法,它可以接受一个名字用于描述返回栈的状态,一般传入null即可。

下面是Fragment程序的示例三.静态显示Fragment碎片页面,并进行两碎片页面的数据通信这里左边四个按钮是一个碎片布局,右边的碎片布局是一个ListView显示数据。

程序运行后效果:

数据交换的后的情况:

设计代码:

布局文件比较简单,所以先展示布局文件。再展示java代码设计。

(一)布局文件activity_main.xml

这里设计两个静态的碎片文件,使用的是小写的fragment标签,里面必须要有name和id(或tag)属性。

(二)第一个碎片页面包含的布局文件fragment_a.xml

相关文章