创建 Fragment

编写:fastcome1985 - 原文:<https://developer.android.com/training/basics/fragments/creating.html>

可以把 Fragment 想象成 Activity 的模块,它拥有自己的生命周期、接收输入事件,可以在 Acvitity 运行过程中添加或者移除(有点像“子 Activity”,可以在不同的 Activity 里重复使用)。这一课教我们将学习继承 Support Library 中的 Fragment,使 APP 在 Android 1.6 这样的低版本上仍能保持兼容。

在开始之前,必须在项目中先引用 Support Library。如果你从未使用过 Support Library,可根据文档 设置 Support Library 在项目中使用 v4 库。当然,也可以使用包含 APP Bar 的 v7 appcompat 库。该库兼容 Android 2.1 (API level 7),同时也包含了 Fragment API。

创建 Fragment 类

首先从 Fragment 继承并创建 Fragment,然后在关键的生命周期方法中插入代码(就和在处理 Activity 时一样)。

其中一个区别是:创建 Fragment 时,必须重写 onCreateView() 回调方法来定义布局。事实上,这是唯一一个为使 Fragment 运行起来需要重写的回调方法。比如,下面是一个自定义布局的示例 Fragment:

1. import android.os.Bundle;
2. import android.support.v4.app.Fragment;
3. import android.view.LayoutInflater;
4. import android.view.ViewGroup;

6. public class ArticleFragment extends Fragment {
7. @Override
8. public View onCreateView(LayoutInflater inflater, ViewGroup container,
9. Bundle savedInstanceState) {
10. // 拉伸该 Fragment 的布局
11. return inflater.inflate(R.layout.article_view, container, false);
12. }
13. }

和 Activity 一样,当 Fragment 从 Activity 添加或者移除、或 Activity 生命周期发生变化时,Fragment 通过生命周期回调函数管理其状态。例如,当 Activity 的 onPause() 被调用时,它内部所有 Fragment 的 onPause() 方法也会被触发。

更多关于 Fragment 的声明周期和回调方法,详见 Fragments 开发指南.

用 XML 将 Fragment 添加到 Activity

Fragments 是可重用的、模块化的 UI 组件。每个 Fragment 实例都必须与一个 FragmentActivity 关联。我们可以在 Activity 的 XML 布局文件中逐个定义 Fragment 来实现这种关联。

注: FragmentActivity 是 Support Library 提供的一种特殊 Activity,用于处理 API 11 版本以下的 Fragment。如果我们 APP 中的最低版本大于等于 11,则可以使用普通的 Activity。

以下是一个 XML 布局的例子:当屏幕被认为是 “large”(用目录名称中的 large 字符来区分)时,它在布局中增加了两个 Fragment。

res/layout-large/news_articles.xml

1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. android:orientation="horizontal"
3. android:layout_width="fill_parent"
4. android:layout_height="fill_parent">

6. <fragment android:name="com.example.android.fragments.HeadlinesFragment"
7. android:id="@+id/headlines_fragment"
8. android:layout_weight="1"
9. android:layout_width="0dp"
10. android:layout_height="match_parent" />

12. <fragment android:name="com.example.android.fragments.ArticleFragment"
13. android:id="@+id/article_fragment"
14. android:layout_weight="2"
15. android:layout_width="0dp"
16. android:layout_height="match_parent" />

18. </LinearLayout>

提示: 更多关于不同屏幕尺寸创建不同布局的信息,请阅读 兼容不同屏幕尺寸。

然后将这个布局文件用到 Activity 中。

1. import android.os.Bundle;
2. import android.support.v4.app.FragmentActivity;

4. public class MainActivity extends FragmentActivity {
5. @Override
6. public void onCreate(Bundle savedInstanceState) {
7. super.onCreate(savedInstanceState);
8. setContentView(R.layout.news_articles);
9. }
10. }

如果使用 v7 appcompat 库,Activity 应该改为继承自 AppCompatActivity,AppCompatActivity 是 FragmentActivity 的子类(更多关于这方面的内容,请阅读 添加 App Bar)。

注: 当通过 XML 布局文件的方式将 Fragment 添加进 Activity 时,Fragment 是不能被动态移除的。如果想要在用户交互的时候把 Fragment 切入与切出,必须在 Activity 启动后,再将 Fragment 添加进 Activity。这部分内容将在下节课阐述。