Android面试系列文章2018之Android部分Fragment篇
Android面试系列文章2018之Android部分Fragment篇
Android面试系列2018知识总结:
http://blog.csdn.net/ClAndEllen/article/details/79257663
1.Fragment为什么会被称为第五大组件?
Android中的4大组件为:Activity,Broadcast,Service,ContentProvider,那么为什么Fragment可以称之为第5大组件呢?你可以这么回答:
因为Fragment有生命周期,使用频率不输于4大组件,可灵活加载到Activity中。然后谈论谈论Fragment如何加载到Activity中:
1.1 Fragment加载到Activity的2种方式
Fragment加载到Activity的方式分为静态加载和动态加载,下面我们看看这两种加载方式:
静态加载:直接在Activity布局文件中指定Fragment。使用指定属性name即可,代码如下所示:
动态加载: 动态加载需要使用到FragmentManager,这种动态加载的方式在开发中是非常常见的,示例代码如下:
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();//将FragmentA从容器中移除掉,减少内存的消耗fragmentTransaction.remove(fragmentA);fragmentTransaction.add(R.id.fragment_layout,new FragmentB());fragmentTransaction.commit();
1.2 Fragment与ViewPager的搭配使用
通常情况下我们开发应用最常见的使用情况是TabLayout+ViewPager+Fragment的使用方式,这就涉及到两个常用的适配器的使用,一个是FragmentPagerAdapter,另外一个是FragmentStatePagerAdapter,那么它们之间有什么区别呢?其实很简单,FragmentPagerAdapter适用于页面较少的情况,而FragmentStatePagerAdapter适用于页面较多的情况。
2.Fragment的生命周期
Fragment的生命周期面试的时候概率还是蛮大的,不过问的时候并不是单纯说整个生命周期的回调函数等等,而是问些特殊情况下的Fragment的生命周期情况,为的是检验你的开发经验,不过不用方,看看笔者推荐的一个链接,你会搞懂各种情况下的Fragment的生命周期,这样面试就不用担心这种问题了:
http://blog.csdn.net/MeloDev/article/details/53406019#comments
Fragment
-
界面打开
onCreate() 方法执行!
onCreateView() 方法执行!
onActivityCreated() 方法执行!
onStart() 方法执行!
onResume() 方法执行! -
按下主屏幕键/锁屏
onPause() 方法执行!
onStop() 方法执行! -
重新打开
onStart() 方法执行!
onResume() 方法执行! -
按下后退键
onPause() 方法执行!
onStop() 方法执行!
onDestroyView() 方法执行!
onDestroy() 方法执行!
onDetach() 方法执行!
Activity
1. 打开应用onCreate() 方法执行!onStart() 方法执行!onResume() 方法执行!2. 按下主屏幕键/锁屏onPause() 方法执行!onStop() 方法执行!3. 重新打开应用onRestart() 方法执行!onStart() 方法执行!onResume() 方法执行!4. 按下后退键onPause() 方法执行! onStop() 方法执行! onDestroy() 方法执行!
开启一个带Fragment的Activity的生命周期情况如下:
-
打开
Fragment onAttach()方法执行
Fragment onCreate() 方法执行!
Fragment onCreateView() 方法执行!
Fragment onViewCreated()方法执行
Activity onCreate() 方法执行!
Fragment onActivityCreated() 方法执行!
Activity onStart() 方法执行!
Fragment onStart() 方法执行!
Activity onResume() 方法执行!
Fragment onResume() 方法执行! -
按下主屏幕键/锁屏
Fragment onPause() 方法执行!
Activity onPause() 方法执行!
Fragment onStop() 方法执行!
Activity onStop() 方法执行! -
再次打开
Activity onRestart() 方法执行!
Activity onStart() 方法执行!
Fragment onStart() 方法执行!
Activity onResume() 方法执行!
Fragment onResume() 方法执行! -
按下后退键
Fragment onPause() 方法执行!
Activity onPause() 方法执行!
Fragment onStop() 方法执行!
Activity onStop() 方法执行!
Fragment onDestroyView() 方法执行!
Fragment onDestroy() 方法执行!
Fragment onDetach() 方法执行!
Activity onDestroy() 方法执行!
3.Fragment的通信
3.1 在Fragment中调用Activity中的方法
在Fragment中调用Activity的方法很简单,Fragment有个getActivity()的方法,比如,在MainActivity中的一个Fragment中获取MainActivity的引用,并调用MainActivity的某个方法methodA()方法你可以这么写:
MainActivity mainActivity = (MainActivity) getActivity();mainActivity.methodA();
3.2 在Activity中调用Fragment的方法
在Activity中调用Fragment中的方法是最简单的,我想这里我不用多说吧!直接接口回调即可调用Fragment的任何可访问的方法。
3.3 在Fragment中调用另外一个Fragment的方法
这个可就需要一定的思维性了,首先要想调用Fragment A的方法,除了这个Fragment A自身可以调用外,这个Fragment A所属的Activity也可以调用,要想另外一个Fragment B调用此Fragment A的方法,Fragment B可以间接通过Activity来进行调用,也就是3.1 和 3.2 的结合。看看下图你自然就会明白了:
4.Fragment的切换方式
Fragment的切换方式分为add()&remove(),hide()&show(),detach()&attach(),也许你会问不是还有replace()方法吗?其实replace()其实是先调用了remove()然后再调用add()方法,所以不算那三种其实之一。那么这三种方式有什么区别呢?add()&remove()就是添加和移除,因此replace()这个方法只是在上一个Fragment不再需要时采用的简便方法。而hide()&show()则是指隐藏和显示,这种方式防止Fragment多次创建实例对象,所以正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个,这样就能做到多个Fragment切换不重新实例化。那么detach()&attach()呢?使用detach()会将view从ViewTree中删除,和remove()不同,此时Fragment的状态依然保持着,在使用attach()时会再次调用onCreateView()来重绘视图,注意使用detach()后Fragment.isAdded()方法将返回false,在使用attach()还原Fragment后isAdded()会依然返回false(需要再次确认)执行detach()和replace()后要还原视图的话, 可以在相应的Fragment中保持相应的view,并在onCreateView()方法中通过view的parent的removeView()方法将view和parent的关联删除后返回,这种方式极少使用,但是面试官文问的话,你如果答得很全,那么面试官会眼前一亮的感觉。
Fragment的懒加载
https://blog.csdn.net/ljcitworld/article/details/77528585
更多相关文章
- android 获取路径目录方法
- Android(安卓)对象序列化之你不知道的 Serializable
- Android Studio 自动更新失败解决方法
- android 获取路径目录方法
- android 获取路径目录方法
- android 获取路径目录方法
- Android(安卓)横屏不重启 Activity
- Android去标题和实现全屏
- ContentProvider数据共享