Android3.0 一个核心类是Fragment(碎片),它具有多个子类。 有趣的是,可以将碎片应用于2.x 的版本,google 专门发布了一个适用于旧版Android 的碎片SDK.android-support-v4.jar
Fragment 可以看作是子活动, 它包含在活动中,仅可存在于活动内,没有活动就无法使用碎片, 碎片可与活动的其他元素共存, 也就是说 无需跳转界面即可使用碎片。碎片可作为界面的一部分。
为什么要使用碎片?
在以下几种场合或情景中,需要使用:
1 显示列表和针对条目的具体视图,当然还包括逻辑;
2 Activity 拥有可在方向更改时轻松保留的小块,以避免在每次旋转屏幕时所有拆卸和重建;
3 当点返回按钮时可逐步返回,同时仍处于当前活动内;
4 一个活动的界面内的许多内容正在改变,希望使过渡看起来比较平滑、优雅.
Fragment 的生命周期
一. 在最开始, 碎片会实例化. 在系统从保存的状态重新创建碎片时, 一定会实例化,即调用默认的构造方法, 然后附加初始化参数包,
创建碎片一种不错的使用模式, 即使用静态工厂方法实例化碎片, 以下展示了MyFragment类 的实例化器的一种工厂类型:
public static MyFragment newInstance(int index) {
MyFragment f = new MyFragment();
Bundle b = new Bundle();
b.putInt("index", index);
f.setArguments(b);
return f;
}
二. 下面分别讲解生命周期的方法, 如果前面没有返回值 ,表示返回 void
1 onAttach(Activity activity)
2 onCreate(Bundle b) 此方法获取传入的已保存包
3 View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle b) 作用: 注意, 这个方法返回碎片的视图层次结构,
4 onActivityCreated(Bundle b), 在活动完成 onCreate() 之后调用 ,这是在显示界面之前,可以对界面进行最后调整的地方。 如果活动和它的碎片是从保存的状态重建的,此方法十分重要
5 onStart() 此方法与活动的onStart() 相绑定, 也就是执行完Activity 的onStart(), 之后执行 Fragment的 onStart()
6 onResume() 与活动的onResume() 相绑定
7 onPause() 碎片的第一个撤销方法,与活动的onPause() 相绑定, 如果在碎片有一个媒体播放器,可通过此方法对它进行暂停、停止或后退, 比如你不希望在接电话时播放音频, 碎片可以从onPause() 返回到onResume()
8 onStop() 碎片的第二个撤销方法, 与活动的onStop() 相绑定
9 onDestroyView() 如果碎片即将被结束或保存,撤销方向的第三个方法, 此方法在 由onCreateView() 方法创建的视图 与碎片分离之后调用
10 onDestroy() 在不再使用时调用, 注意: 它仍然附加到活动并可找到, 但不能执行其他操作
11 onDetach() 拆卸、分离, 这是最后一个方法, 调用后,碎片不会与其活动 绑定, 它不再拥有视图.
---------------------------------------------------
注意上图的虚线, 碎片的一个功能是: 可以指定你不希望在重建活动时完全销毁碎片, 也就是碎片依然存在。可以使用setRetainInstance() , 它设定一个boolean值,来表明“是, 我希望在活动重启时等待恢复” 或“不, 我将从头创建一个新的碎片” ,调用setRetainInstance() 的最佳位置是在碎片的onCreate() 方法中. 设为true时,如果
Activity被销毁并重新创建,则必须将碎片与Activity分离并将它附加到新的Activity.
上图的虚线表示将跳过 onDestroy() ,以及在将碎片重新附加到新Activity 时跳过onCreate()
---------------------------------------------------
在示例程序,在main.xml 布局文件 <fragment> 用于将放置此碎片的占位符
DetailsActivity 代码如下:
public class DetailsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getResources().getConfiguration().orientation
== Configuration.ORIENTATION_LANDSCAPE) {
/* 如果当前是横屏,这表示MainActivity 曾带标题和文本显示过,
* 所以activity 不再需要,需保证让 MainActivity 完成所有工作
*/
finish();
return;
}
if(getIntent() != null) {
// 这是初始化详情 碎片的另一种方式
DetailsFragment d = DetailsFragment.newInstance(getIntent().getExtras());
// 开启Fragment 事务,并增加,提交
getFragmentManager().beginTransaction().add(android.R.id.content, d).commit();
}
}
}
需要注意: 碎片必须位于视图容器内,碎片不是视图
具体代码请参见 ShakespeareIntrumented工程, 一个示意图:
注意: 程序在横竖屏 切换时,不仅Activity 会销毁、重新创建,碎片也会。