Android面经(12/30)Fragment全解析
牛客高级系列专栏:
安卓(安卓系统开发也要掌握)
- 想通关安卓面试,请看(承诺免费售后答疑):《150道安卓高频面试题目录及答案链接》
- 想通关安卓系统面试,请看:《140道安卓系统Framework面试题目录及答案链接》
- 想进阶安卓开发,请看(承诺免费售后答疑):《Android进阶知识体系解析_15大安卓进阶必备知识点》
- 想了解安卓APP完整开发流程,请看(承诺免费售后答疑):《安卓APP完整开发流程》
- 想掌握安卓App性能优化,请看(承诺免费售后答疑):《安卓性能优化讲解和实战专栏》
- 想掌握Gradle语法和配置,制作Gradle插件,请看(承诺免费售后答疑):《安卓Gradle语法解析和实践大全》
嵌入式
- 想通关嵌入式面试,请看: 《111道嵌入式面试题目录及答案链接》
- 想多掌握几个嵌入式项目,请看:《6个嵌入式项目交流分享(附源码)》
本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;
网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您提高安卓面试准备效率,为您面试保驾护航!
正文开始⬇
随着安卓UI开发能力的提升,一定会接触到Fragment开发,而在面试提问的问题频率中,个人认为Fragment属于“进阶”的面试主题,因此,安卓入门后,无论日常开发还是面试都必须对Fragment有所了解。面试官可能会问:
- Fragment是什么?和Activity的联系?生命周期如何?⭐⭐⭐⭐⭐⭐
- Activity和Fragment之间如何通讯?Fragment和Fragment之间如何通讯?⭐⭐⭐⭐⭐
- Fragment的回退栈了解吗?⭐⭐⭐⭐
- Fragment的使用方式⭐⭐⭐
- 你有遇到过哪些关于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的生命周期影响。下图是网上找到的一张非常全面的图。
结合我们熟悉的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个方法):
- onAttach(Activity):当Fragment与Activity发生关联时调用,即将Fragment绑定到Activity时,并且在这个方法可以通过getArguments()方法获取传入该Fragment的参数;
- onCreateView(LayoutInflater, ViewGroup, Bundle):创建该Fragment的视图时调用;
- onActivityCreated(Bundle):当Activity的onCreated()方法返回时调用;
- onDestroyView():对应onCreateView()方法,当该Fragment的视图被移除时调用;
- 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发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。