Android Fragment生命周期—多屏支持

在使用fragment之前,fragment的生命周期是一个需要关心的问题。目前,要想在android上开发出一款app必须得考虑到“碎片化”的问题,或者说必须考虑多屏幕适配,这是每一个开发者都必须面对的问题。
现在市场上手机的屏幕分辨率、尺寸五花八门,更糟糕的是,除了手机外还有平板!我们都清楚,就单单屏幕尺寸来说手机和平板差异很大。所以,当我们开发应用程序的时候,要谨记我们的app应该能适用于不同的设备上而且必须达到最优效果,这样才能确保获得更佳用户体验。于是问题就产生了,我们需要调整应用在手机和平板上显示相同的效果,也就是现在所说的多屏幕适配。在之前的一篇帖子里,我已经讲了怎么用android的一些特性做多屏幕支持,比如创建不同的布局文件等等。这个方式现在也还可以这么做,但是已经不能满足我们的要求了。
一个经典的例子是,应用中有一个列表,用户点击列表条目就可以显示详细信息。这种情况下,我们可以使应用在手机和平板上有不同的体验效果。在手机上需要两个activity来完成这个功能,如图:
当用户点击后,出现的界面是这样的:
而在平板上,我们我们需要好好利用屏幕,把列表和详情显示在一起,如图:
从上面的例子我们清楚地看到,我们需要一个方法去“合并activity”,让其中一个activity调用另一个时,两个activity都能同时或者先后显示。我们需要在不重写代码的情况下重新组织界面布局,而仅仅使用多布局来做是不行的,我们需要别的技术。
fragment
在android3.0上引入了一个新概念叫fragment。它有自己的布局文件,可以作为组件排布,也可以相互组合去实现不同的布局显示。使用fragment可以重复利用代码,并且可以满足不同设备尺寸的需求。fragment不能单独存在,只能存在于activity中,而一个activity可以拥有多个fragment。很重要的一点是,fragment可以和activity中的其它组件一起使用,无需重写所有activity的接口。所以使用fragment就可以这样来完成上例中“主界面—详细界面”的app需求。
在手机上是这样显示的:
而在平板上是这样的:
fragment生命周期
既然我们已经知道了fragment很好用,那么我们也需要知道它的工作原理。fragment只能存在于(作为容器的)activity中,每一个fragment都有自己的视图结构,可以像我们之前那样载入布局。fragment的生命周期更加复杂,因为它有更多的状态,如图:
我们来看一下fragment完整的生命周期。
在fragment生命周期开始,oninflate方法被调用。要注意的是,这个方法只在我们直接用标签在布局文件中定义的时候才会被调用。我们可以在这个方法中保存一些在xml布局文件中定义的配置参数和一些属性。
这一步过后就轮到onattach被调用了。这个方法在fragment绑定到它的父activity中的时候被调用,我们可以在这里保存它和activity之间的引用。
之后oncreate会被调用。这是最重要的步骤之一。fragment就是在这一步中产生的,可以用这个方法来启动其它线程来检索数据,比如从远程服务器中启动。
oncreateview这个方法是在fragment创建自己的视图结构的时候被调用,在这个方法中我们会载入fragment的布局文件,就像我们在listview控件中载入布局一样。在这个过程中,我们不能保证父activity是否已经创建,所以有一些操作我们不能在这里完成。
可以看到,在onactivitycreated后activity才算是建立完成。到这一步,我们的activity就创建成功并激活了。我们可以随时使用它了。
下一步就是onstart了,在这里我们做的事和activity中的onstart一样,在这个方法中fragment虽然可以显示,但是还不能和用户进行交互,只有在onresume后fragment才能开始和用户进行交互操作。在这个过程后,fragment就已经启动并运行起来了。
也许会暂停activity。activity的onpause方法会被调用。这时候fragment的onpause方法也会被调用。
系统也可能会销毁fragment的视图显示,发生这种情况时ondestroyview方法就被调用了。
之后,如果系统需要完全销毁整个fragment的话,ondestroy方法就会被调用了。这时候我们就需要释放掉所有可用的连接了,因为这个时候fragment马上就要被杀掉了。虽然是在准备销毁的过程中,但是fragment仍然绑定在父activity中。
最后一步就是把fragment从activity中解绑,即调用ondetach方法。
怎么创建一个fragment
现在我们了解了fragment的生命周期了,接着我们就需要知道怎么创建一个fragment并绑定到activity中,第一件要做的事就是继承android.app.fragment来写一个fragment,假设我们的fragment叫做fragment1,创建和定义如下:
1
2
3
public class fragment1 extends fragment {
...
}
就像我们上面说的,fragment只能存在于activity中,所以我们必须要在某处定义它,有两种方式:
- 直接在xml布局文件中定义;
- 在xml布局文件中定义一个占位符,然后动态地在activity中操作fragment;
我们定义fragment的方式会影响它的生命周期,因为在上述第一种情况下oninflate方法会被调用,而第二种情况下它的生命周期是从onattach方法开始的。
如果我们在xml文件中定义fragment的话,我们需要:
1
2
3
4
然而如果我们在xml中用占位符的话,需要再做一些工作。
布局框架和fragment
如果我们在xml布局文件中定义fragment的话,就不能自由、动态修改fragment了,还有别的方法可以让我们可以更灵活地操作:使用时需要在xml文件中定义:
1
2
3
在activity里面还需要做一点工作,因为我们必须手动初始化fragment,然后把它“插入”到framelayout中。
1
2
3
4
5
6
7
8
9
10
11
12
public class mainactivity extends activity {
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
fragment2 f2 = new fragment2();
fragmenttransaction ft = getfragmentmanager().begintransaction();
ft.replace(r.id.fl1, f2);
ft.commit();
}
关于fragmenttransaction等内容的讨论我们留到下一篇文章再说吧,本文就到这里了。

Saber在机电一体化设计中的应用
深耕4/5G协同技术,助力移动网络4/5G网络协同发展
自研搜索,苹果意在何为?
淘宝产品全面升级,即将迎来市场的新机遇
商汤科技发布SenseEarth智能遥感影像解译平台
Android Fragment生命周期—多屏支持
大数据处理系统模式及其应用分析
抢到的小米9没有闪光灯?官方迅速采取措施
流动式UWB系统--变电站安全防护器具装备
oppor11发布会倒计时:除了2000万双摄,即将发布的oppor11还有这些杀手锏
一加5、荣耀9什么时候上市:双旗舰之争!麒麟960对标骁龙835,谁才是新机之最?
Multiclet宣布正在开发Multiclet S2通用处理器 性能将超过Intel酷睿i7
VCC(电源)和GND(地)之间电容的作用
宜百利
麻省理工学院开发新系统,通过肌肉信号控制机器人
科创板心脉医疗副总经理李莉介绍、履历信息
小米正在打造一款具备360度环绕立体声效果的智能音箱产品
魅族Pro 7不用联发科Helio X30,改投高通怀抱
变压器油温过高原因分析
多点零磁通电流传感器的技术亮点