Android 进阶:Fragment 源码深入理解

本文详细探讨了Android中的Fragment,包括FragmentManager和FragmentTransaction的使用。分析了Fragment的生命周期,添加、替换和回退栈的实现原理,并揭示了Fragment与Activity交互的细节。此外,还介绍了嵌套Fragment的工作机制。
摘要由CSDN通过智能技术生成

上周预热的文章,结果自己打脸了,实在抱歉  (。ŏ_ŏ)。


日常开发中我们经常使用 Fragment 管理布局,使用起来非常方便,但是在简单的 API 背后隐藏了什么操作,很多人恐怕不了解。

如果你回答不出这些问题,那这篇文章可能就对你有些帮助:

  • Fragment FragmentManager FragmentTransaction 的关系和作用

  • Fragment 如何实现布局的添加替换

  • 嵌套 Fragment 的原理

Fragment 的使用

Fragment 的使用大家应该都熟悉,这里举个例子,要实现这样的类似饿了么点餐效果:

界面丑了点,但意思是差不多的哈,左边一个列表,点击后切换右边的布局。我们就可以使用 Fragment 来实现。

实现也很简单,创建一个的布局,然后在 Activity 里点击时替换 Fragment。

代码很简单,核心就三步:

  1. 创建 Fragment

  2. 获取 FragmentManager

  3. 调用事务,添加、替换

我们一步步来了解这背后的故事。

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值