天天看点

Training--使用Fragment创建动态UI(1)-- 创建一个Fragment

使用Fragment创建动态UI(1)-- 创建一个Fragment

你可以认为一个Fragment就是activity中的一个模块化区域,它拥有自己的生命周期,可以接收自己的输入事件,你可以在activity的运行过程中添加或者移除它(就像在不同的activity中可以复用的子activity)。本课程将向你展示如何使用支持库来继承Fragment类,这样就可以兼容版本低达1.6的安卓平台。

注意:如果你的最低的API等级版本定义达到11或者更高,那么你不需要使用支持库,你可以直接使用系统包里内置的Fragment类和相关API。请注意,本课程由于使用了支持库中的Fragment类,它与内置的Fragment类的包名和一些API接口的名字有一部分是不同的。

在开始课程前,你需要在你的工程中安装支持库。如果没有这些库的话,你可以从官网上下载v4的支持库。你可以使用v7 appcompat支持库,这样你就可以使用Action bar,这个库只兼容2.1(API等级7)以上的版本,同时也包含了Fragment API接口。

创建一个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或者被移除,或者宿主activity在自己的生命周期状态间迁移的时候,这个fragment也能管理自己的状态。例如,当一个activity的onPause()被调用的时候,其中的fragment也会接收到onPause()回调。

更多的关于fragment的生命周期和回调方法的细节请参考 Fragment开发者指南(官网上有,如果时间充裕的话,总有一天会翻译到那儿的)。

使用XML添加一个Fragment到Activity中

当Fragment可用的时候,每一个Fragment类的实例,模块化UI组件都必须与一个宿主FragmentActivity实例绑定。你可以在一个activity的布局XML文件里通过定义一个Fragment来达到这种绑定的目的。

注意:FragmentActivity是在支持库中才提供的为了兼容API等级低于11的系统的一个特别的activity类。如果你的app要求系统最低版本是API等级11及以上的话,那么你可以直接使用一个普通的Activity类即可。

下面这个例子展示的是当一个设备屏幕“大”(large修饰符指示的)的时候,就添加两个Fragment到activity中。

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应该继承ActionBarActivity,这个类是FragmentActivity的子类。

注意:如果你在activity的布局XML文件里添加了一个Fragment,那么你不能在运行过程中移除它。如果你想在与用户交互的过程中动态添加和移除fragment,那么你必须在activity第一次启动的时候添加一个fragment,具体细节请查看下节课。