Android面经(12/30)Fragment全解析

牛客高级系列专栏:

安卓(安卓系统开发也要掌握)

嵌入式

本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;

网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您提高安卓面试准备效率,为您面试保驾护航!

正文开始⬇

随着安卓UI开发能力的提升,一定会接触到Fragment开发,而在面试提问的问题频率中,个人认为Fragment属于“进阶”的面试主题,因此,安卓入门后,无论日常开发还是面试都必须对Fragment有所了解。面试官可能会问:

  1. Fragment是什么?和Activity的联系?生命周期如何?⭐⭐⭐⭐⭐⭐
  2. Activity和Fragment之间如何通讯?Fragment和Fragment之间如何通讯?⭐⭐⭐⭐⭐
  3. Fragment的回退栈了解吗?⭐⭐⭐⭐
  4. Fragment的使用方式⭐⭐⭐
  5. 你有遇到过哪些关于Fragment的问题,如何处理的?⭐⭐⭐

看完以下的解析,一定可以让面试官眼前一亮。

目录

  • 1、什么是Fragment
  • 2、Fragment的生命周期
  • 3、Fragment的使用方式
    • 3.1 静态使用
    • 3.2 动态使用
    • 3.3 getFragmentManager(),getSupportFragmentManager(),getChildFragmentManager()之间的区别
  • 4、通讯
    • 4.1 Fragment和Actvity的通讯
    • 4.2 Fragment和Fragment的通讯
  • 5、Fragment的回退栈
  • 6、Fragment状态保存
  • 7、你有遇到过哪些关于Fragment的问题,如何处理的?
    • 7.1 getActivity()空指针:
    • 7.2 Fragment视图重叠

1、什么是Fragment

刚开始学习Activity的时候,一个界面就是一个Activity。那么,如果想在一个Activity界面上镶嵌另一个界面如何做呢?Fragment翻译为“片段,破片”,可以理解为“显示在Activity中的Activity”,为解决Android碎片化而生。Fragment可以作为一个Activity界面中独立的子界面,拥有自己的生命周期,也可以接受用户的触摸事件。我们可以在一个Activity界面上添加多个Fragment子界面,并且每个Fragment都可以动态的添加、删除、替换,从而使得安卓界面开发具有更强大的灵活性。

比如微信首页有“微信”、“通讯录”、“发现”、“我”,这4个子界面就是4个Fragment。我们在设计Fragment的时候,需要考虑模块化和可复用化。最后,总结一下使用Fragment的优势:

  • 可以把一个Activity分为多个可复用的组件,使得UI开发更加有灵活性,之前一个Activity如果需要多个布局的话,就需要设置多个布局文件,又麻烦,性能也不高;
  • 每个Fragment都是独立的个体,可以动态的添加、删除、替换等,同时也可以同一个Fragment供多个Activity使用;
  • 与Activity切换相比,Fragment属于轻量切换,Fragment的出现,解决了Activity之间切换不流畅的问题;
  • 与View相比,View也可以实现在一个Activity上部署几个子界面,但View不能通过startActivityForResult()方法(现在建议使用:registerForActivityResult()方法)接收到返回结果,而且View通常更关注视图的实现;

2、Fragment的生命周期

Fragment的生命周期是Fragment面试题里最常问的,就是和Activity生命周期的比较,同时学习Fragment的生命周期最好也是结合Activity的生命周期来学习,因为Fragment是依附于Activity存在的,所以它的生命周期也受到Activity的生命周期影响。下图是网上找到的一张非常全面的图。

alt

结合我们熟悉的Activity生命周期来学习:

  • Activity::onCreate()
    • Fragment::onAttach()
    • *Fragment::onCreate()
    • *Fragment::onCreateView()
    • *Fragment::onActivityCreated()
  • Activity::onStart()
    • *Fragment::onStart()
  • Activity::onResume()
    • *Fragment::onResume()
  • Activity::onPause()
    • *Fragment::onPause()
  • Activity::onStop()
    • *Fragment::onStop()
  • Activity::onDestroy()
    • *Fragment::onDestroyView()
    • *Fragment::onDestroy()
    • *Fragment::onDetach()

Activity一般有创建-开始-继续-暂停-停止-销毁共六大阶段,Fragment同样也经历了这六大阶段。从上面可以看到最大的差别在于创建-销毁这两个阶段,多出了以下5个方法(上面加粗的5个方法):

  1. onAttach(Activity):当Fragment与Activity发生关联时调用,即将Fragment绑定到Activity时,并且在这个方法可以通过getArguments()方法获取传入该Fragment的参数;
  2. onCreateView(LayoutInflater, ViewGroup, Bundle):创建该Fragment的视图时调用;
  3. onActivityCreated(Bundle):当Activity的onCreated()方法返回时调用;
  4. onDestroyView():对应onCreateView()方法,当该Fragment的视图被移除时调用;
  5. onDetach():对应onAttach()方法,当Fragment与Activity取消关联时调用;

  • 除了onCreateView(),如果重写了其他的方法,则必须调用父类对于该方法的实现;

  • Activity每一个生命周期都会引发Fragment调用同样的回调,如Activity收到onStop()后,里面的每个Fragment都会收到onStop(),同理,Fragment的onResume()也是在Activity的onResume()之后调用。但是onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()都是在Activity的onStart()中调用的;

3、Fragment的使用方式

Fragment的使用方式包括静态使用和动态使用。其中,静态是直接在xml布局文件中声明Fragment,动态则是使用代码来动态实现。

3.1 静态使用

步骤:

  • 创建一个继承Fragment的自定义XrFragment类,重新onCreateView()方法,在该方法中设置对应的xml布局文件;
public class XrFragment extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        /*
        * 参数1:布局xml文件的ID
        * 参数2:容器,被inflate的布局的父ViewGroup
        * 参数3:是否将这个生成的View添加到这个容器中去
        * 作用是将布局文件封装在一个View对象中,并填充到此Fragment中
        * */
        View v = inflater.inflate(R.layout.xr_fragment, container, false);
        return v;
    }
}
  • 在Activity的布局文件直接声明该自定义XrFragment类即可。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    <fragment
        android:id="@+id/xr_fragment"  // 在这里声明
        android:name="com.example.XrFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

3.2 动态使用

一个Activity可以有多个Fragment,如果我们需要设置两个按键,按下按键可以打开对应的Fragment可以这么做:

// 先创建两个自定义Fragment类
public class XrFragment1 extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.xr_fragment_1, container, false);
        return v;
    }
}

public class XrFragment2 extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.xr_fragment_2, container, false);
        return v;
    }
}

接着在Activity中将上述两个自定义Fragment绑定两个按键即可:

public class XuruiActivity extends AppCompatActivity {

    private Button bt_1;
    private Button bt_2;
    private Fr

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Android高频面试题全解析 文章被收录于专栏

#提供免费售后答疑!!花一杯奶茶的钱获得安卓面试答疑服务,稳赚不赔# Android发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。

全部评论

相关推荐

1 1 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1154042次浏览 17179人参与
# 通信和硬件还有转码的必要吗 #
11280次浏览 101人参与
# 不去互联网可以去金融科技 #
21175次浏览 260人参与
# 和牛牛一起刷题打卡 #
19237次浏览 1643人参与
# 实习与准备秋招该如何平衡 #
203625次浏览 3629人参与
# 大厂无回复,继续等待还是奔赴小厂 #
5112次浏览 34人参与
# OPPO开奖 #
19474次浏览 270人参与
# 通信硬件薪资爆料 #
266233次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2245次浏览 34人参与
# 互联网公司评价 #
97821次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25056次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
455149次浏览 5132人参与
# 国企和大厂硬件兄弟怎么选? #
53959次浏览 1013人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14663次浏览 349人参与
# 硬件人的简历怎么写 #
82312次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19443次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28862次浏览 250人参与
# 学历对求职的影响 #
161319次浏览 1805人参与
# 你收到了团子的OC了吗 #
539016次浏览 6390人参与
# 你已经投递多少份简历了 #
344440次浏览 4965人参与
# 实习生应该准时下班吗 #
97099次浏览 723人参与
# 听劝,我这个简历该怎么改? #
63537次浏览 622人参与
牛客网
牛客企业服务