Android 面试题库 - Fragment(一) - 基础

本贴最后更新于 2255 天前,其中的信息可能已经时移世改

Fragment 为什么成为第五大组件

Fragment 为什么成为第五大组件

四大组件:Activity、Service、Broadcast Receiver、Content Provider

Fragment 具有生命周期,使用广泛

Fragment 加载到 Activity 的两种方式

  • xml 通过 fragment 标签引入的方式
  • code 中动态添加

FragmentPagerAdapter 和 FragmentStatePagerAdapter

  • FragmentPagerAdapter 的 destroyItem 的时候并没有直接销毁 item,只是分离了 UI
  • FragmentStatePagerAdapter 是直接销毁了 Fragment
  • Fragment 多的时候选择 FragmentStatePagerAdapter,少的时候选择 FragmentPagerAdapter

Fragment 的生命周期

Fragment 生命周期

Activity 生命周期对 Fragment 生命周期的影响

Framgnet 之间的通信

  • Fragment 通过 getActivity 获取到 Activity
  • Fragment 实现接口,Activity 通过接口来管理
  • 两个 Fragment 之间通过广播来传输数据
  • 使用事件总线传递数据

Framgnt 管理器:FragmentManger

如何获取 FragmentManger

  • Activity 中通过 getSupportFragmentManager 获取
  • Fragment 中通过 getChildFragmentManager 获取

常用方法

  • add 添加一个 Fragment 实例
  • remove 移除一个 Fragment 实例
  • replace 替换一个 Fragment 实例

ViewPager 加载 Fragment 如何实现页面可见再加载数据

ViewPager 是默认缓存 1 的 pager,也就是默认加载隔壁的 Fragment。而 mOffscreenPageLimit 这是默认为 1 的,且 setOffscreenPageLimit 传入的数据小于 1 也会默认赋值为 1。以下是两种实现方式:

从 ViewPaer

  • 重写整个 ViewPager,将 mOffscreenPageLimit 赋值为 0
  • 通过反射获取 mOffscreenPageLimit 的值,然后进行赋值

从 Fragment

  • 定义 isCreate 变量默认为 false
  • 在 onCreate 方法中赋值为 true
  • 重写 setUserVisibleHint 方法,代码如下
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser && isCreate) {
            isCreate = false
            // todo you something 
        }
    }
  • ViewPager 的 mOffscreenPageLimit 设置为 mFragments 的大小
  • 需要注意:第 0 个 Framgnet 不能使用上面的方法,需要特殊处理,onCreate 中判断 Fragment 的下标赋值 isCreate 的值

如何获得 Fragment 的实例

  • 保留空构造方法,否则会在某些情况下抛出错误:make sure class name exists, is public, and has an empty constructor that is public
  • 不要直接不要直接通过 new 的方式获取,应该使用:newInstance 方式来获取,以下是 kotlin 示例:
companion object {
	/**
	 * 获取PartyBillHandledFragment的实例
	 */
	fun newInstance(): PartyBillHandledFragment {
		val args = Bundle()
		val fragment = PartyBillHandledFragment()
		fragment.arguments = args
		return fragment
	}
}

startActivityForResult 之坑

  • 在 Fragment 中请勿使用 getActivity().startActivityForResult(),这样 Framgnet 中的 onActivityResult 是接收不到回调,而是回调 Activity 的 onActivityResult。
  • 正确的应该是直接使用 startActivityForResult()方法
  • requestCode 请勿传-1
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 201 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖
  • fragment
    4 引用 • 1 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...