创建 Fragment

您可以将 Fragment 视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或移除 Fragment(有点像可以在不同 Activity 中重复使用的“子 Activity”)。本课介绍如何使用支持库扩展 Fragment 类,以便让您的应用仍能兼容运行的系统版本低至 Android 1.6 的设备。

您应创建具有生命周期感知能力的组件,而不是在 Fragment 的生命周期方法中设置依赖组件。在您的 Fragment 经历其生命周期时,该组件可以处理所需的任何设置或分解。然后,其他 Fragment 和 Activity 便可重复使用具有生命周期感知能力的组件,以避免复制代码,并减少 Fragment/Activity 中所需的设置量。如需了解详情,请阅读使用具有生命周期感知能力的组件处理生命周期

开始学习本课之前,您必须将 Android 项目设置为使用支持库。如果您以前未使用过支持库,请按照支持库设置文档将您的项目设置为使用 v4 支持库。不过,您也可以改用 v7 appcompat 库,将应用栏添加到您的 Activity 中,该库兼容 Android 2.1(API 级别 7),并且还附带 Fragment API。

如需关于实施 Fragment 的更多信息,请参阅 Fragment。您也可以通过探索相关示例应用了解详情。

创建 Fragment 类

要创建 Fragment,请扩展 Fragment 类,然后替换关键生命周期方法以插入您的应用逻辑,这与您对 Activity 类的操作方法类似。

创建 Fragment 时的一个区别是,您必须使用 onCreateView() 回调来定义布局。事实上,这是您让 Fragment 得以运行所需的唯一回调。例如,以下是一个自行指定布局的简单 Fragment:

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 添加或从中移除 Fragment,以及当 Activity 发生生命周期状态转变时,利用这些回调管理 Fragment 状态。例如,调用 Activity 的 onPause() 方法时,Activity 中的任何 Fragment 也会收到对 onPause() 的调用。

如需关于 Fragment 生命周期和回调方法的详细信息,请参阅 Fragment 开发者指南。

使用 XML 为 Activity 添加 Fragment

尽管 Fragment 是可重复使用、模块化的界面组件,但 Fragment 类的每个实例都必须与父 FragmentActivity 相关联。您可以通过在 Activity 布局 XML 文件内定义每个 Fragment 来实现这种关联。

请注意:FragmentActivity 是支持库中的一种特殊 Activity,用于处理 API 级别 11 之前的系统版本上的 Fragment。如果您所支持的最低系统版本为 API 级别 11 或更高,则可以使用普通 Activity

以下是一个示例布局文件,它会在设备屏幕被视为“大”(由目录名称中的 large 限定符指定)时为 Activity 添加两个 Fragment。

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>

提示:如需关于为不同屏幕尺寸创建布局的更多信息,请阅读支持不同屏幕尺寸

然后,对您的 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 库,则您的 Activity 应改为扩展 AppCompatActivity,其为 FragmentActivity 的子类。如需更多信息,请阅读添加应用栏

请注意:如果您通过在布局 XML 文件中定义 Fragment 来为 Activity 布局添加 Fragment,则无法在运行时移除 Fragment。如果您打算在用户交互过程中换入和换出 Fragment,则必须按照构建灵活的界面中所述方法在 Activity 一开始时为 Activity 添加 Fragment。