您的位置首页>硬件>

Android Fragment生命周期—多屏支持

导读 大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Android Fragment生命周期—多屏支持问题。在使用Fragment之前,Fragment的生命周

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Android Fragment生命周期—多屏支持问题。

在使用Fragment之前,Fragment的生命周期是一个问题。目前想要在安卓上开发一款APP,就必须考虑“碎片化”的问题,或者说多屏适配的问题,这是每个开发者都必须面对的问题。

如今,市场上手机的屏幕分辨率和尺寸各不相同。更糟糕的是,手机之外还有平板电脑!众所周知,单就屏幕尺寸而言,手机和平板电脑有很大的区别。所以我们在开发APPlications的时候,要牢记我们的app要适用于不同的设备,必须达到最好的效果,这样才能保证更好的用户体验。于是问题就出现了。我们需要调整应用程序,在手机和平板电脑上显示相同的效果,这就是现在所说的多屏适配。在之前的一篇帖子中,我已经谈到了如何使用安卓的一些功能来支持多屏幕,比如创建不同的布局文件等等。这种方式现在还可以做,但是已经不能满足我们的要求了。

一个经典的例子是,应用程序中有一个列表,用户可以单击列表条目来显示详细信息。在这种情况下,我们可以让应用在手机和平板电脑上有不同的体验效果。手机上需要两个Activity才能完成这个功能,如图:

当用户单击时,界面如下所示:

在平板上,我们需要利用好屏幕一起显示列表和细节,如图:

从上面的例子中,我们可以清楚地看到,我们需要一个方法来“合并活动”,这样当一个AcTIvity调用另一个AcTIvity时,两个AcTIvity可以同时显示,也可以相继显示。我们需要在不重写代码的情况下重新组织界面布局,但是不可能只使用多个布局。我们需要其他技术。

碎片

在Android3.0上引入了一个叫Fragment的新概念,它有自己的布局文件,可以排列成组件,也可以相互组合,实现不同的布局显示。使用Fragment可以重用代码,满足不同设备尺寸的需求。片段不能单独存在,只能存在于AcTIvity中,一个ActIon可以有多个片段。片段可以与活动中的其他组件一起使用,而无需重写所有活动的接口,这一点非常重要。因此,使用Fragment可以满足上例中“主界面-详细界面”的APP需求。

手机上是这样显示的:

在平板上,是这样的:

碎片生命周期

既然我们知道了Fragment非常有用,我们也需要知道它是如何工作的。片段只能存在于Activity中(作为容器),每个片段都有自己的视图结构,可以像我们之前那样加载布局。Fragment的生命周期更复杂,因为它有更多的状态,如图所示:

让我们看看Fragment的完整生命周期。

在片段生命周期的开始,调用onInflate方法。请注意,只有当我们直接在带有标签的布局文件中定义该方法时,才会调用该方法。我们可以用这种方法保存xml布局文件中定义的一些配置参数和属性。

这一步之后,轮到奥纳塔奇被叫了。当fragment绑定到它的父Activity时调用这个方法,我们可以在这里保存Fragment和Activity之间的引用。

然后将调用OnCreate。这是最重要的步骤之一。片段在此步骤中生成,可用于启动其他线程来检索数据,例如从远程服务器启动。

当片段创建自己的视图结构时,调用onCreateView方法。在这个方法中,我们将加载Fragment的布局文件,就像我们在ListView控件中加载布局一样。在这个过程中,我们无法保证父Activity是否已经创建,所以这里有一些操作我们无法完成。

如您所见,在活动创建中。

d后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

class="com.survivingwithandroid.fragment.Fragment1"

android:layout_width="match_parent"

android:layout_height="20dp"/>

然而如果我们在XML中用占位符的话,需要再做一些工作。

布局框架和Fragment

如果我们在XML布局文件中定义Fragment的话,就不能自由、动态修改Fragment了,还有别的方法可以让我们可以更灵活地操作:使用时需要在XML文件中定义:

1

2

3

<frameLayout android:id="@+id/fl1"android:layout_width="match_parent"

android:layout_height="200dp"/>

在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等内容的讨论我们留到下一篇文章再说吧,本文就到这里了。

 

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。