美文网首页Android开发Android开发经验谈Android技术知识
Android面试题库 - Fragment(一) - 基础

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

作者: AndroidRookie | 来源:发表于2018-09-02 23:14 被阅读26次

    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

    相关文章

      网友评论

        本文标题:Android面试题库 - Fragment(一) - 基础

        本文链接:https://www.haomeiwen.com/subject/ymuvwftx.html