Android面试题库 - Fragment(一) - 基础 有更新!

  aohanyao

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