【威哥说】自从Google在Android3.0引入Fragment,此后Activity基本成为了Fragment的载体,项目的UI几乎全部Fragment来实现,本文就来让你学会Fragment官方的使用方法。
【正文】Android 在 Android 3.0(API 11 级)中引入了Fragment,主要是为了给大屏幕(如平板电脑)上更加动态和灵活的 UI 设计提供支持。由于平板电脑的屏幕比手机屏幕大得多,因此可用于组合和交换 UI 组件的空间更大。利用Fragment实现此类设计时,您无需管理对视图层次结构的复杂更改。 通过将 Activity 布局分成Fragment,您可以在运行时修改 Activity 的外观,并在由 Activity 管理的返回栈中保留这些更改。
要想创建Fragment,您必须创建 Fragment 的子类(或已有其子类)。Fragment 类的代码与 Activity非常相似。它包含与 Activity 类似的回调方法,如 onCreate()、onStart()、onPause() 和onStop()。实际上,如果您要将现有 Android 应用转换为使用Fragment,可能只需将代码从 Activity 的回调方法移入Fragment相应的回调方法中。
通常,您至少应实现以下生命周期方法:
onCreate()
系统会在创建Fragment时调用此方法。您应该在实现内初始化您想在Fragment暂停或停止后恢复时保留的必需Fragment组件。
onCreateView()
系统会在Fragment首次绘制其用户界面时调用此方法。 要想为您的Fragment绘制 UI,您从此方法中返回的 View 必须是Fragment布局的根视图。如果Fragment未提供 UI,您可以返回 null。
onPause()
系统将此方法作为用户离开Fragment的第一个信号(但并不总是意味着此Fragment会被销毁)进行调用。 您通常应该在此方法内确认在当前用户会话结束后仍然有效的任何更改(因为用户可能不会返回)。
大多数应用都应该至少为每个Fragment实现这三个方法,但您还应该使用几种其他回调方法来处理Fragment生命周期的各个阶段。
这里介绍几个Fragment的子类,均是为了方便大家的使用,SDK的封装:
DialogFragment
显示浮动对话框。使用此类创建对话框可有效地替代使用 Activity 类中的对话框帮助程序方法,因为您可以将Fragment对话框纳入由 Activity 管理的Fragment返回栈,从而使用户能够返回清除的Fragment。
ListFragment
显示由适配器(如 SimpleCursorAdapter)管理的一系列项目,类似于 ListActivity。它提供了几种管理列表视图的方法,如用于处理点击事件的 onListItemClick() 回调。
PreferenceFragment
以列表形式显示 Preference 对象的层次结构,类似于 PreferenceActivity。这在为您的应用创建“设置” Activity 时很有用处。
Fragment通常用作 Activity 用户界面的一部分,将其自己的布局融入 Activity。
要想为Fragment提供布局,您必须实现 onCreateView() 回调方法,Android 系统会在Fragment需要绘制其布局时调用该方法。您对此方法的实现返回的 View 必须是Fragment布局的根视图。
注:如果您的Fragment是 ListFragment 的子类,则默认实现会从 onCreateView() 返回一个 ListView,因此您无需实现它。
要想从 onCreateView() 返回布局,您可以通过 XML 中定义的布局资源来扩展布局。为帮助您执行此操作,onCreateView() 提供了一个 LayoutInflater对象。
例如,以下这个 Fragment 子类从 example_fragment.xml 文件加载布局:
public static class ExampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.example_fragment, container, false);
}
}
在上例中,R.layout.example_fragment 是对应用资源中保存的名为example_fragment.xml 的布局资源的引用。传递至 onCreateView() 的 container 参数是您的Fragment布局将插入到的父 ViewGroup(来自 Activity 的布局)。savedInstanceState 参数是在恢复Fragment时,提供上一Fragment实例相关数据的 Bundle。
inflate() 方法带有三个参数:
1.布局的资源 ID;
2.布局父项的 ViewGroup。传递 container 对系统向扩展布局的根视图(由其所属的父视图指定)应用布局参数具有重要意义;
3.指示是否应该在扩展期间将扩展布局附加至 ViewGroup(第二个参数)的布尔值。(在本例中,其值为 false,因为系统已经将扩展布局插入container—传递 true 值会在最终布局中创建一个多余的视图组。)
那么如何将该Fragment添加到您的 Activity 中?
通常,Fragment向宿主 Activity 贡献一部分 UI,作为 Activity 总体视图层次结构的一部分嵌入到 Activity 中。可以通过两种方式向 Activity 布局添加Fragment:
在 Activity 的布局文件内声明Fragment
在本例中,您可以将Fragment当作视图来为其指定布局属性。 例如,以下是一个具有两个Fragment的 Activity 的布局文件:
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
android:id="@+id/viewer"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
fragment标签中的 android:name 属性指定要在布局中实例化的 Fragment 类。
当系统创建此 Activity 布局时,会实例化在布局中指定的每个Fragment,并为每个Fragment调用 onCreateView() 方法,以检索每个Fragment的布局。系统会直接插入Fragment返回的 View 来替代 fragment元素。
注:每个Fragment都需要一个唯一的标识符,重启 Activity 时,系统可以使用该标识符来恢复Fragment(您也可以使用该标识符来捕获Fragment以执行某些事务,如将其删除)。 可以通过三种方式为Fragment提供 ID:
为 android:id 属性提供唯一 ID
为 android:tag 属性提供唯一字符串
如果您未给以上两个属性提供值,系统会使用容器视图的 ID
或者通过编程方式将Fragment添加到某个现有 ViewGroup
您可以在 Activity 运行期间随时将Fragment添加到 Activity 布局中。您只需指定要将Fragment放入哪个 ViewGroup。
要想在您的 Activity 中执行Fragment事务(如添加、删除或替换Fragment),您必须使用 FragmentTransaction 中的 API。您可以像下面这样从 Activity 获取一个 FragmentTransaction 实例:
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
然后,您可以使用 add() 方法添加一个Fragment,指定要添加的Fragment以及将其插入哪个视图。例如:
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
传递到 add() 的第一个参数是 ViewGroup,即应该放置Fragment的位置,由资源 ID 指定,第二个参数是要添加的Fragment。
一旦您通过 FragmentTransaction 做出了更改,就必须调用 commit() 以使更改生效。这样我们就把Fragment添加到Activity,运行就可以显示出来了,赶快试试吧!
本文出自微信公众号mjw-java,更多内容关注微信公众号或访问www.moliying.com