天天看点

Android系列之Fragment(一)----Fragment加载到Activity当中

【正文】

android上的界面展示都是通过activity实现的,activity实在是太常用了。但是activity也有它的局限性,同样的界面在手机上显示可能很好看,在平板上就未必了,因为平板的屏幕非常大,手机的界面放在平板上可能会有过分被拉长、控件间距过大等情况。这个时候更好的体验效果是在activity中嵌入"小activity",然后每个"小activity"又可以拥有自己的布局。因此,我们今天的主角fragment登场了。

一、fragment初探:

fragment是activity的界面中的一部分或一种行为。你可以把多个fragment们组合到一个activity中来创建一个多面界面,并且你可以在多个activity中重用一个fragment。你可以把fragment认为模块化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity运行时被添加或删除。

fragment不能独立存在,它必须嵌入到activity中,而且fragment的生命周期直接受所在的activity的影响。例如:当activity暂停时,它拥有的所有的fragment们都暂停了,当activity销毁时,它拥有的所有fragment们都被销毁。然而,当activity运行时(在onresume()之后,onpause()之前),你可以单独地操作每个fragment,比如添加或删除它们。当你在执行上述针对fragment的事务时,你可以将事务添加到一个栈中,这个栈被activity管理,栈中的每一条都是一个fragment的一次事务。有了这个栈,就可以反向执行fragment的事务,这样就可以在fragment级支持“返回”键(向后导航)。

当向activity中添加一个fragment时,它须置于viewgroup控件中,并且需定义fragment自己的界面。你可以在layoutxml文件中声明fragment,元素为:<fragment>;也可以在代码中创建fragment,然后把它加入到viewgroup控件中。然而,fragment不一定非要放在activity的界面中,它可以隐藏在后台为actvitiy工作。

设计的哲学:

为了让界面可以在平板上更好地展示,android在3.0版本引入了fragment(碎片)功能,通过官方文档中的这张图片可以很明显地看到fragment的好处:

Android系列之Fragment(一)----Fragment加载到Activity当中

注:左边为平板,右边为手持设备。

二、fragment的生命周期:

因为fragment必须嵌入在acitivity中使用,所以fragment的生命周期和它所在的activity是密切相关的。

如果activity是暂停状态,其中所有的fragment都是暂停状态;如果activity是stopped状态,这个activity中所有的fragment都不能被启动;如果activity被销毁,那么它其中的所有fragment都会被销毁。

但是,当activity在活动状态,可以独立控制fragment的状态,比如加上或者移除fragment。

当这样进行fragment transaction(转换)的时候,可以把fragment放入activity的back stack中,这样用户就可以进行返回操作。

使用fragment时,需要继承fragment或者fragment的子类(dialogfragment, listfragment, preferencefragment, webviewfragment),所以fragment的代码看起来和activity的类似。

每当创建一个fragment时,首先添加以下三个回调方法:

oncreate():系统在创建fragment的时候调用这个方法,这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。

oncreateview():当第一次绘制fragment的ui时系统调用这个方法,该方法将返回一个view,如果fragment不提供ui也可以返回null。注意,如果继承自listfragment,oncreateview()默认的实现会返回一个listview,所以不用自己实现。

onpause():当用户离开fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。

将fragment加载到activity当中有两种方式:

方式一:添加fragment到activity的布局文件当中

方式二:在activity的代码中动态添加fragment

第一种方式虽然简单但灵活性不够。添加fragment到activity的布局文件当中,就等同于将fragment及其视图与activity的视图绑定在一起,且在activity的生命周期过程中,无法切换fragment视图。

第二种方式比较复杂,但也是唯一一种可以在运行时控制fragment的方式(加载、移除、替换)。

下面将分别介绍一下。

  

三、在activity的布局文件中添加fragment:(不推荐)

平板的模拟器参数如下:

Android系列之Fragment(一)----Fragment加载到Activity当中

然后新建一个工程文件。然后继续如下步骤:

(1)新建文件fragment_hello.xml和hellofragment.java:

fragment_hello.xml代码如下:(即fragment的布局文件)

Android系列之Fragment(一)----Fragment加载到Activity当中
Android系列之Fragment(一)----Fragment加载到Activity当中

hellofragment.java代码如下:

Android系列之Fragment(一)----Fragment加载到Activity当中
Android系列之Fragment(一)----Fragment加载到Activity当中

重点在于第19和20行,通过inflate()方法将自定义的fragment的布局加载进来。

19行代码中,第二个参数中,如果布局没有根,那就用null。

注:上方代码中,因为我们的程序是面对android 4.0以上版本的,所以导入fragment的包时,选择第一个:android.app.fragment

Android系列之Fragment(一)----Fragment加载到Activity当中

(2)将fragment添加到activity的布局中:

修改activity_main.xml的代码如下:

Android系列之Fragment(一)----Fragment加载到Activity当中
Android系列之Fragment(一)----Fragment加载到Activity当中

08行和09行是关键。其中android:name属性填上你自己创建的fragment的完整类名。如下图:

Android系列之Fragment(一)----Fragment加载到Activity当中

当系统创建这个activity的布局文件时,系统会实例化每一个fragment,并且调用它们的oncreateview()方法,来获得相应fragment的布局,并将返回值插入fragment标签所在的地方。

运行之后,效果如下:

Android系列之Fragment(一)----Fragment加载到Activity当中
Android系列之Fragment(一)----Fragment加载到Activity当中

实际上,这种方式在开发中并不推荐,我们来介绍另外一种方法。

四、在activity代码中添加fragment:

【实例】点击左侧fragment中的按钮,弹出右侧的fragment。新建一个工程文件,然后步骤如下:

(1)将activity_main的布局分为两部分:左边占1/4,右边占3/4。修改activity_main.xml的代码如下:

Android系列之Fragment(一)----Fragment加载到Activity当中
Android系列之Fragment(一)----Fragment加载到Activity当中

上方代码中,一个linearlayout代表一个fragment的容器,记得要给每个fragment加一个容器的id。上方代码的布局效果如下:

Android系列之Fragment(一)----Fragment加载到Activity当中

既然两个fragment的空间都分配好了,接下来右边的fragment写出来。

(2)新建文件fragment_right.xml和rightfragment.java:

fragment_right.xml代码如下:(添加一个文本和按钮)

Android系列之Fragment(一)----Fragment加载到Activity当中
Android系列之Fragment(一)----Fragment加载到Activity当中

rightfragment.java代码如下:

Android系列之Fragment(一)----Fragment加载到Activity当中
Android系列之Fragment(一)----Fragment加载到Activity当中

紧接着,我们修改上方oncreateview()方法中的代码,实现点击按钮,能够弹出吐司:

Android系列之Fragment(一)----Fragment加载到Activity当中
Android系列之Fragment(一)----Fragment加载到Activity当中

第04行代码:有一个单词view不要忘了。

第08行代码:第一个参数一定是getactivity,以此来获得父类的activity

(3)在activity代码中添加fragment:

点击mainactivity中左侧的按钮,弹出右侧的fragment,

mainactivity.java的监听器部分的代码如下:

Android系列之Fragment(一)----Fragment加载到Activity当中
Android系列之Fragment(一)----Fragment加载到Activity当中

记住上面的三个步骤。

第12行代码是整个程序的核心。add()方法里的第一个参数是容器视图资源id,而不是layout。容器视图资源id有两个作用:

告知fragmentmanager,fragment视图应该出现在activity视图的什么地方

是fragmentmanager队列中fragment的唯一标识符

运行后,效果如下:

Android系列之Fragment(一)----Fragment加载到Activity当中

点击左侧的按钮后,出现右侧的界面。点击右侧的按钮,弹出吐司。效果如下:

Android系列之Fragment(一)----Fragment加载到Activity当中

当然,这个代码还不够成熟,因为还涉及到了生命周期没有处理。我们将在下一章节中进行讲解。

继续阅读