欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-12 21:30:04
...

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的生命周期

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

Android面试题库 - 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
相关标签: 面试题库