Android Fragment 的使用.doc
文本预览下载声明
Android Fragment 的使用
Fragment 简介
作为 Activity 界面的一部分,Fragment 的存在必须依附于 Activity,并且与 Activity 一样,拥有自己的生命周期,同时处理用户的交互动作。同一个 Activity 可以有一个或多个 Fragment 作为界面内容,并且可以动态添加、删除 Fragment,灵活控制 UI 内容,也可以用来解决部分屏幕适配问题。
另外,support v4 包中也提供了 Fragment,兼容 Android 3.0 之前的系统(当然,现在 3.0 之前的系统在市场上已经很少见了,可以不予考虑),使用兼容包需要注意两点:
Activity 必须继承自 FragmentActivity;
使用 getSupportFragmentManager() 方法获取 FragmentManager 对象;
生命周期
作为宿主 Activity 的一部分,Activity 拥有的大部分生命周期函数在 Fragment 中同样存在,并与 Activity 保持同步。同时,作为一个特殊情况的存在,Fragment 也有一些自己的生命周期函数,如 onAttach()、onCreateView() 等。
至于 Activity 与 Fragment 之间生命周期函数的对应同步关系,来自 GitHub 的 xxv/android-lifecycle 项目用了一幅图完美地予以展示:
创建实例
像普通的类一样,Fragment 拥有自己的构造函数,于是我们可以像下面这样在 Activity 中创建 Fragment 实例:
MainFragment mainFragment = new MainFragment();
如果需要在创建 Fragment 实例时传递参数进行初始化的话,可以创建一个带参数的构造函数,并初始化 Fragment 成员变量等。这样做,看似没有问题,但在一些特殊状况下还是有问题的。
我们知道,Activity 在一些特殊状况下会发生 destroy 并重新 create 的情形,比如屏幕旋转、内存吃紧时;对应的,依附于 Activity 存在的 Fragment 也会发生类似的状况。而一旦重新 create 时,Fragment 便会调用默认的无参构造函数,导致无法执行有参构造函数进行初始化工作。
好在 Fragment 提供了相应的 API 帮助我们解决这个问题。利用 bundle 传递数据,参考代码如下:
public static OneFragment newInstance(int args){
OneFragment oneFragment = new OneFragment();
Bundle bundle = new Bundle();
bundle.putInt(someArgs, args);
oneFragment.setArguments(bundle);
return oneFragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
int args = bundle.getInt(someArgs);
}
嵌入方式
Activity 嵌入 Fragment 分为布局静态嵌入和代码动态嵌入两种。前者在 Activity 的 Layout 布局中使用 fragment 标签嵌入指定 Fragment,如:
?xml version=1.0 encoding=utf-8?
LinearLayout xmlns:android=/apk/res/android
android:layout_width=match_parent
android:layout_height=match_parent
android:orientation=vertical
fragment
android:layout_width=match_parent
android:layout_height=match_parent
class=com.yifeng.samples.OneFragment/
/LinearLayout
后者在 Activity 的 Java 代码中借助管理器类 FragmentManager 和 事务类 FragmentTransaction 提供的
显示全部