注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接: http://developer.android.com/training/basics/fragments/creating.html
你可以把一个fragment看成是一个activity的模块,有着自己的生命周期,接收自己的时间输入,你可以在activity的运行阶段添加或者移除fragment(某种意义上说,像是你可以在不同activity中重用的子activity)。这堂课将会展示如何通过使用 Support Library 来继承 Fragment 类,这样一来,你的应用就能与Android 1.6及以上的设备兼容了。
Note:
如果你决定你的应用仅支持API Level 11及以上的系统,那么你无需使用 Support Library ,可以使用框架中内置的 Fragment 类和与它相关的APIs。不过要注意这堂课关注的是使用 Support Library 中提供的API,它和平台中内置的 Fragment 类相比,区别在于两者的包签名不同,有时候还有一些接口名字上的差异。
在你开始学习这节课之前,你必须合理配置你的Android项目来使用 Support Library。如果在此之前你没有使用过 Support Library,那么按照 Support Library Setup 这一文档的步骤,配置你的项目来使用 v4 库。然而,你也可以使用“ v7应用兼容库( v7 appcompat library ) ”使你的activities包含 action bar ,此时你的应用将兼容Android 2.1(API Level 7)及以上的系统,同时也包含了 Fragment 的APIs。
一). 创建一个Fragment类
为了创建一个fragment,继承 Fragment 类,之后覆写核心生命周期函数来插入你的应用逻辑,这和你处理 Activity 类的方法很相似。
当创建一个
Fragment
时,有一点不同的地方是:你必须使用
onCreateView()
回调函数来定义它的布局。事实上,这是唯一一个为了使一个
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自身声明周期状态发生转变时)。例如,当activity调用了
onPause()
方法,所有activity中的fragment也将调用
onPause()
方法。
可以阅读 Fragments 获取更多关于fragment生命周期和回调函数的知识。
二). 使用XML将Fragment添加至一个Activity
尽管fragments是可重用、模块化的UI组件,每个fragment的实例必须和一个父 FragmentActivity 关联。你可以通过在activity的XML布局文件中定义每一个fragment来实现这种关联。
Note:
FragmentActivity 是一个由 Support Library 提供的 特殊 activity,用来处理早于API Level 11系统中的fragment。如果你所支持的系统版本高于API Level 11,那么你可以直接用常规的 Activity 。
下面是一个布局文件的例子,它向一个activity添加了两个fragment,前提是设备屏幕可认为是“大( large )”的(通过在目录名后面添加“ large ”适配符)。
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 >
Tip:
关于更多为不同屏幕尺寸创建布局的知识,可以阅读: 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); } }
如果使用的是 v7 appcompat library ,你的activity应该继承 ActionBarActivity ,它是 FragmentActivity 的子类。 更多信息可以阅读: Adding the Action Bar (博客链接: http://www.cnblogs.com/jdneo/p/3440367.html )。
Note:
当你通过将fragment在XML布局文件中定义的方式把fragment添加到activity中,你不能再运行时移除这个fragment。如果你计划在用户交互过程中可以吧fragment换入或换出,你必须在activity第一次启动的时候把这个fragment添加到activity中,这是下节课将会展示的内容。