创建 Fragment
这节课教你
- 创建一个 Fragment 类
- 使用 XML 添加 Fragment 到 Activity
你还需要阅读
试试
FragmentBasics.zip
你可以认为 fragment 是 activity 的模块化的部分,它有自己的生命周期,接收自己的输入事件,你可以在 activity 的运行过程中把它添加到 activity 或从 activity 中删除它(有点像一个你可以在不同 activity 中使用的"子 activity")。这节课教你怎样使用支持库扩展Fragment
类,让你的应用与运行低至安卓 1.6版本的设备保持兼容。
注意:如果你决定了你的应用要求的最小 API 等级是11或更高,你不需要使用支持库,你可以使用由
类和相关 API 构建的框架。你需要注意到这节课着重介绍使用支持库的 API,它使用特定的包签名,有时 API 名称和平台包含的版本有些不一样。
Fragment
在开始这节课之前,你必须设置你的安卓工程使用支持库。如果你以前没用过支持库,根据设置支持库文档设置你的工程使用v4 库。不过,你也可以使用v7 appcompat 库,它与安卓 2.1(API 等级 7)兼容并且包含Fragment
API,使你的 activity 包含操作栏。
创建一个 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) { // 为这个 fragment 渲染布局 return inflater.inflate(R.layout.article_view, container, false); } }
就像一个 activity,一个 fragment 应该实现其他的生命周期回调方法,这允许你在 fragment 添加到 activity 或从 activity 中删除时或 activity 的生命状态转变时,管理 fragment 的状态。例如,当一个 activity 的onPause()
方法被调用,这个 activity 中的任何 fragment 都收到一个onPause()
调用。
更多关于 fragment 生命周期和回调方法的信息,参见 Fragments 开发者指南。
使用 XML 添加 Fragment 到 Activity
Fragment 是可重用的,模块化的 UI 组件,一个
Fragment
类的每个实例必须和一个父FragmentActivity
关联。你可以通过在你的 activity 的布局 XML 文件中定义每个 fragment 来实现这种关联。
注意: FragmentActivity
支持库为了在比 API 等级 11老的系统版本上处理 fragment而提供的一个特殊的 activity。如果你支持的最低系统版本是 API
等级 11 或更高,你可以使用一个常规的Activity
。
这里是一个当设备是大屏幕时(由目录名称中的 large
限定符指定)给一个 activity 添加两个 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>
技巧:更多关于为不同的屏幕尺寸创建布局的信息,参见支持不同的屏幕尺寸。
然后给你的 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
的一个子类(更多信息,参见添加操作栏)。
注意:当你通过在布局 XML 中定义 fragment 来添加 fragment 到 activity 时,你不能在运行时删除这个 fragment。如果你计划根据用户操作换入或换出 fragment,你必须在 activity 第一次启动时添加 fragment 到 activity,这会在下节课介绍。