原文地址:http://android.xsoftlab.net/training/basics/fragments/index.html

导言

为了在Android中创建动态的多面板用户界面,你需要将UI组件和活动的行为封装到模块中,这些模块可以在activity中互相交换。你可以使用类Fragment创建这些模块,这些习性看起来像一个鸟巢状的activity,它允许定义自己的布局和管理自己的生命周期。

当Fragment指定了布局,它可以与其它fragment以不同的方式组合进activity中,以便可以对不同的屏幕尺寸做适应,小屏幕可能需要在同一时刻只展示一个fragment,而大屏幕可以同时展示两个或两个以上的fragment。

这节课将会展示如何通过fragment创建动态的用户效果,并改进APP在不同屏幕尺寸上的展示的用户效果,同时继续支持运行Android1.6系统的设备。

创建一个Fragment

你可以把fragment想象为activity的一个单独的模块,这个模块拥有自己的生命周期,并且可以接收用户输入。并且可以在activity运行的时候添加或移除fragment。这节课展示了如何继承支持库中的Fragment,从而可以使APP可以运行在Android1.6这种低版本上。

Note:如果选择了APP的最低支持版本为11或者11以上,那么就不需要使用支持库。这时可以使用框架中的Fragment类。不过需要意识到这节课使用的是支持库中的Fragment,这里的API名称可能会与框架中的Fragment名称有稍微的不同。

在开始这节课之前,必须确认工程已经使用了支持库。如果还没有使用支持库的话,请选择v4包中的支持库。你也可以使用包含了ActionBar的v7支持库,不过它只能运行在Android2.1及以上的版本上。

创建一个Fragment类

如果要创建一个Fragment,需要继承Fragment类,然后重写关键的生命周期函数,与Activity类的方式很相似。

唯一的不同就是在创建Fragment时必须使用onCreateView方法定义布局。实际上,如果要简单运行的话,这是唯一个需要重写的方法。举个例子:

import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.ViewGroup;public class ArticleFragment extends Fragment {    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,        Bundle savedInstanceState) {        // Inflate the layout for this fragment        return inflater.inflate(R.layout.article_view, container, false);    }}

正如Activity一样,一个fragment应该实现其它生命周期函数,这些生命周期函数可以管理各种状态,比如说添加到activity的状态或是从activity移除的状态,或是像activity类似的生命周期状态。举个例子,当activity的onPause方法被调用时,在activity中的每一个fragment的onPause方法也会被调用。

有关更多fragment的生命周期以及回调函数介绍请参见Fragments开发文档。

使用XML将Fragment添加到Activity中

虽然fragment有可重用化、UI组件模块化的特点,但是每一个fragment都需要与FragmentActivity关联才能使用。你可以在activity的XML布局文件中通过定义的方式达成这种关联。

**Note:**FragmentActivity是支持库中一个特殊的activity,它使得fragment可以在版本11以下的设备上运行。如果APP的最低支持版本在11及11以上的话,可以使用正规的Activity类。

下面的这个布局例子展示了当设备的屏幕被认为是”large”时,添加了两个Fragment到Activity中(特别指明布局文件夹的目录包含”large”标识符):
res/layout-large/news_articles.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent">    <fragment android:name="com.example.android.fragments.HeadlinesFragment" android:id="@+id/headlines_fragment" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" />    <fragment android:name="com.example.android.fragments.ArticleFragment" android:id="@+id/article_fragment" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /></LinearLayout>

Tips:有关更多针对不同的屏幕尺寸创建布局的信息,请参见:Supporting Different Screen Sizes(本系列也有翻译,请自行查找)。

然后将布局应用到Activity中:

import android.os.Bundle;import android.support.v4.app.FragmentActivity;public class MainActivity extends FragmentActivity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.news_articles);    }}

如果你使用了v7 appcompat library,Activity应该替换为继承ActionBarActivity,它是FragmentActivity的子类。

Note:如果通过XML布局的方式将Fragment添加到了Activity中,那么在运行时是不可以移除Fragment的。如果你计划在用户使用的时候将Fragment换进换出,那么你必须在Activity第一次启动的时候把fragment添加进去。下一节课将会讨论这些。

更多相关文章

  1. 给android添加busybox
  2. Android(安卓)的几种布局方式及实践【转】
  3. Android(安卓)Studio官方文档之添加多种密度的矢量图形
  4. Android(安卓)10 新特性(以后没有甜品了)
  5. Android视图加载到窗口的过程
  6. 【Android学习】Day 1
  7. Android(安卓)SystemUI源码分析与修改
  8. Android(安卓)子布局不超过父布局 圆角
  9. 【Android】Sqlite数据库增删改查

随机推荐

  1. Android进阶(一)View体系
  2. (一)Android应用程序及组件简介
  3. 【Android实战开发】3G技术和Android发展
  4. AndroidManifest.xml 详解 (四) 之uses-p
  5. 阿里ctf-2014 android 第三题——so动态
  6. 成品app直播源码,Android自屏幕底部滑出更
  7. Android中Handler异步线程
  8. 3. Android(安卓)MultiMedia框架完全解析
  9. android 广播接受者
  10. (三)Android Context说明