我们如果把activity界面分割为多个模块,那么一个fragment就可以认为是其中的一个模块,这个模块有着自己的生命周期,可以接收自己的输入事件,而且在activity运行的时候,你可以动态的增加或者移除它(就好像一个"子activity”,你可以在不同的activity里面来使用它)。这一节我们就来学习如何利用Support Library来扩展Fragment 类,让你的app可以在跑着android 1.6老版本的android机器上保持兼容。
注意:如果因为某些原因,你将你的APP支持的最小的API版本为11或者之上,那么你不需要使用Support Library 里面的,可以直接使用frameworkd层的
Fragment 类和对于的android.jar包提供的API函数。要知道,我们在这一节里面只是学习如何使用Support Library里面的API函数,这些函数使用了特别的包名,API的名字也和平台里面所包含的名称有些略微不同。
创建一个Fragment类
创建一个由Fragment扩展的fragment,你要去重写它里面的生命周期函数,在里面实现你的APP的逻辑,就像重写Activity里面的生命周期方法一样。
另外一个不同之处是,当你创一个
Fragment的时候,你必须使用
onCreateView()这个回调函数在定义layout。实际上,这个函数也是如果仅仅是为了让你的fragment运行,唯一需要的回调函数。下面就是一个简单的例子,定义它的layout.
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生命周期和回调函数的信息,请阅读:Fragments
使用XML为一个Activity添加一个Fragment
fragment是一个可重复利用,独立的UI模块组件,每一个
Fragment类的实例都必须和
FragmentActivity关联。你可以在activity的layout的xml文件里面,添加fragment来实现这种关联。
注意:
FragmentActivity 是Support Library 里面针对系统API 版本在11之下的时候,来处理fragment的类。如果你的APP支持的最小API版本在11或者之上,那就可以直接用Activity来处理fragment。
下面的这个例子就是在large屏幕下的layout xml文件里面添加了2个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>
提示:关于更多的创建不同屏幕下的layout文件,请阅读
Supporting Different Screen ,或者我们前面已经翻译的章节。
下面是activity如何使用这个layout.
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添加一个fragment,那么,我们无法在activity运行的时候动态的移除这个fragment。如果你想在用户使用期间让你的fragment动态在展示或者移除之间乱换,那么你必须在activity第一次开始的添加fragment到activity。我们在下一节中很快就讲解。