上周预热的文章,结果自己打脸了,实在抱歉 (。ŏ_ŏ)。
日常开发中我们经常使用 Fragment 管理布局,使用起来非常方便,但是在简单的 API 背后隐藏了什么操作,很多人恐怕不了解。
如果你回答不出这些问题,那这篇文章可能就对你有些帮助:
-
Fragment FragmentManager FragmentTransaction 的关系和作用
-
Fragment 如何实现布局的添加替换
-
嵌套 Fragment 的原理
Fragment 的使用
Fragment 的使用大家应该都熟悉,这里举个例子,要实现这样的类似饿了么点餐效果:
界面丑了点,但意思是差不多的哈,左边一个列表,点击后切换右边的布局。我们就可以使用 Fragment 来实现。
实现也很简单,创建一个的布局,然后在 Activity 里点击时替换 Fragment。
代码很简单,核心就三步:
-
创建 Fragment
-
获取 FragmentManager
-
调用事务,添加、替换
我们一步步来了解这背后的故事。
Fragment 大家应该比较熟悉,放到最后。
先来看看 FragmentManager
。
FragmentManager
public abstract class FragmentManager {...}
FragmentManager
是一个抽象类,定义了一些和 Fragment 相关的操作和内部类/接口。
定义的操作
FragmentManager 中定义的方法如下:
//开启一系列对 Fragments 的操作
public abstract FragmentTransaction beginTransaction();
//根据 ID 找到从 XML 解析出来的或者事务中添加的 Fragment
//首先会找添加到 FragmentManager 中的,找不到就去回退栈里找
public abstract Fragment findFragmentById(@IdRes int id);
//跟上面的类似,不同的是使用 tag 进行查找
public abstract Fragment findFragmentByTag(String tag);
//弹出回退栈中栈顶的 Fragment,异步执行的
public abstract void popBackStack();
//立即弹出回退栈中栈顶的,直接执行哦
public abstract boolean popBackStackImmediate();
//返回栈顶符合名称的,如果传入的 name 不为空,在栈中间找到了 Fragment,那将弹出这个 Fragment 上面的所有 Fragment
//有点类似启动模式的 singleTask 的感觉
//异步执行
public abstract void popBackStack(String name, int flags);
//...
//获取 manager 中所有添加进来的 Fragment
public abstract List<Fragment> getFragments();
可以看到,定义的方法有很多是异步执行的,后面看看它究竟是如何实现的异步。
内部类/接口:
-
BackStackEntry:Fragment 后退栈中的一个元素
-
onBackStackChangedListener:后退栈变动监听器
-
FragmentLifecycleCallbacks: FragmentManager 中的 Fragment 生命周期监听
//后退栈中的一个元素
public interface BackStackEntry {
//栈中该元素的唯一标识
public int getId();
//获取 FragmentTransaction#addToBackStack(String) 设置的名称
public String getName();
//...
}
可以看到 BackStackEntry
的接口比较简单,关键信息就是 ID 和 Name。
//在 Fragment 回退栈中有变化时回调
public interface OnBackStackChangedListener {
public void onBackStackChanged();
}
//FragmentManager 中的 Fragment 生命周期监听
public abstract static class FragmentLifecycleCallbacks {
//...
}
}
熟悉 Fragment 生命周期的同学一定觉得很面熟,这个接口就是为我们提供一个 FragmentManager 所有 Fragment 生命周期变化的回调。
小结:
可以看到,FragmentManager
是一个抽象类,它定义了对一个 Activity/Fragment 中 添加进来的 Fragment 列表、Fragment 回退栈的操作、管理。
实现类 FragmentManagerImpl
FragmentManager
定义的任务是由 FragmentManagerImpl
实现的。
主要成员:
final class FragmentManagerIm