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

简介: Fragment为什么成为第五大组件Fragment为什么成为第五大组件四大组件:Activity、Service、Broadcast Receiver、Content ProviderFragment具有生命周期,使用广泛Fragment加载...

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

img_9775c572c621d806b121dd809cd03fb0.jpe
Fragment生命周期
img_d921740c2bda339e6de3692f70907386.jpe
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
目录
相关文章
|
1月前
|
存储 安全 Java
Android 面试题及答案整理,最新面试题
Android 面试题及答案整理,最新面试题
91 2
|
3月前
|
设计模式 前端开发 JavaScript
前端 面试题库
前端 面试题库
|
3月前
|
Web App开发 存储 JavaScript
前端面试题库 面试题 JS难题,做对一半就是高手(二)
前端面试题库 面试题 JS难题,做对一半就是高手(二)
147 0
|
3月前
|
JavaScript 前端开发 小程序
前端面试题库 面试题 JS难题,做对一半就是高手(一)
前端面试题库 面试题 JS难题,做对一半就是高手
|
3月前
|
前端开发 JavaScript 小程序
前端入门指南前端面试题库
前端入门指南前端面试题库
|
3月前
|
Android开发
Android基础知识:什么是Fragment?与Activity的区别是什么?
Android基础知识:什么是Fragment?与Activity的区别是什么?
292 54
|
3月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_123 The Most Recent Orders for Each Product
「SQL面试题库」 No_123 The Most Recent Orders for Each Product
|
3月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_122 Fix Product Name Format
「SQL面试题库」 No_122 Fix Product Name Format
|
3月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_121 The Most Recent Three Orders
「SQL面试题库」 No_121 The Most Recent Three Orders
|
3月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_120 Patients With a Condition
「SQL面试题库」 No_120 Patients With a Condition