Fragment可以看成是Activity的一个模块,拥有自己的生命周期,独立接收输入事件,可以在Activity运行期间动态添加或删除(类似于可做多个Activity中重用的“子Activity ”)。本节介绍如何基于支撑库创建自己的Fragment对象,保证应用软件可以在Android 1.6及以上版本的设备上均可正常运行。
注意:如果开发环境的最低API Level设置为11或者更高,开发者可以直接使用框架内嵌的Fragment类及相关API。值得注意的是,本节关注在支撑库基础上使用相关API,使用了特定的包签名,API名称也可能因为平台使用的版本不同而有细小的差异。
开始本节学习之前,需创建一个使用支撑库的Android工程。如果开发者之前没有使用过支撑库,可以参考支撑库建立文档建立一个使用v4库的工程,或者建立一个支持action栏的v7 appcompat库的工程。
创建一个Fragment
以Fragment类为基类,参考Activity的操作,覆写派生类关键的生命周期方法以实现开发者自己的逻辑即可创建一个Fragment。
创建Fragment的不同之处在于定义界面布局需要使用onCreateView()回调方法,事实上,onCreateView()就是运行一个Fragment需要使用的唯一方法。下面代码展示了一个简单的Fragment指定了自己的界面布局:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;
public classArticleFragmentextendsFragment{
@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()方法被调用,所有在这个Activity里面的Fragment都会收到一个对其onPause()方法的调用。
Fragment开发者指南中提供了Fragment的生命周期和回调方法的更详细介绍。
使用XML将一个Fragment加到Activity
Fragment是模块化的UI部件,具有可重用性,每个Fragment实例都需要关联到一个父FragmentActivity,这种关联关系可以通过在activity布局xml文件中定义fragment来实现。
注意:FragmentActivity是支撑库提供的一种特殊的Activity,用于在API Level 11以前的版本上实现Fragment。如果工程定义的最低版本高于API Level 11,则可以直接使用Activity类来实现Fragment。
下面的代码展示了一个为大屏幕设备中的Activity添加两个Fragment:
<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 accompat Library,Activity需基于FragmentActivity的派生类ActionBarActivity创建。
注意:通过在布局XML文件中定义为Activity布局添加的Fragment不能在运行时删除,如果希望能够在运行时对Fragment进行操作,Fragment应该在Activity初次创建时添加(参见下节)。