Android Training - 应用碎片创建一个动态UI(2) - 创建一个碎片

Android Training - 使用碎片创建一个动态UI(2) - 创建一个碎片
你可以认为碎片是部分activity的模块化。它有自己的生命周期,接受自己输入事件,可以在activity运行时被添加和删除(类似一个子activity,你可以在不同的activity中复用)。这个课程展示了怎么使用支持库扩展Fragment类,让Android1.6这样的老版本也能兼容你的程序。

提示:如果你的最小API级别是11或者更高,你就不需要使用支持库,可以直接使用框架构建Fragment类和相关API。这个课程关注的是使用支持库中的API,和那些直接包含在平台中的版本,这些API使用特别的包名和稍微不同的API名称。

创建一个碎片类

创建一个碎片需要扩展Fragment类,在程序中覆盖关键生命周期方法,类似于使用Activity类。

一个不同点是,你需要在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) {
        // 给碎片填充布局
        return inflater.inflate(R.layout.article_view, container, false);
    }
}
和activity一样,一个fragment需要实现其他生命周期回调,允许你管理它从activity被添加或者删除时的状态,像activity转换她的生命周期状态一样。例如,当activity的onPause()函数被调用时,activity中所有的碎片也都会接收一个onPause()调用。

更多关于碎片生命周期函数的信息,可以参考这里: Fragments

使用XML添加一个碎片到activity中

虽然碎片是可重用,模块化的UI组件,每个Fragment类的实例都必须关联一个父类FragmentActivity。你可以定义每个碎片在你的activity布局XML文件中来实现这个联系。

提示:FragmentActivity是一个特别的activity,支持库提供它来管理API级别11以下的碎片。如果你支持的最低版本是11或者更高,你可以直接使用Activity。

下面是一个布局文件的实例,在设备是large屏幕(在目录名中指定了large限定符)时,添加两个碎片到一个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>
补充:更多关于不同尺寸布局文件的支持,请看 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);
    }
}
提示:当你在布局XML文件中为activity添加碎片时,你不可以在运行时移除碎片。如果你打算在用户交互时换入和换出碎片,你必须在activity第一启动时添加碎片,请看下一课。