乐趣区

史上最全的Android面试题集锦二

原文链接:https://blog.csdn.net/xiangzhihong8/java/article/details/96280254

3、fragemnt

3.1、创立形式

(1)动态创立

首先咱们须要创立一个 xml 文件,而后创立与之对应的 java 文件,通过 onCreatView()的返回办法进行关联,最初咱们须要在 Activity 中进行配置相干参数即在 Activity 的 xml 文件中放上 fragment 的地位。
` <fragment

    android:name="xxx.BlankFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</fragment>

`
2)动态创建
动态创建 Fragment 次要有以下几个步骤:

创立待增加的 fragment 实例。
获取 FragmentManager,在 Activity 中能够间接通过调用 getSupportFragmentManager()办法失去。
开启一个事务,通过调用 beginTransaction()办法开启。
向容器内增加或替换 fragment,个别应用 repalce()办法实现,须要传入容器的 id 和待增加的 fragment 实例。
提交事务,调用 commit()办法来实现。
3.2、Adapter 比照
FragmnetPageAdapter 在每次切换页面时,只是将 Fragment 进行拆散,适宜页面较少的 Fragment 应用以保留一些内存,对系统内存不会多大影响。

FragmentPageStateAdapter 在每次切换页面的时候,是将 Fragment 进行回收,适宜页面较多的 Fragment 应用,这样就不会耗费更多的内存

3.3、Activity 生命周期
Activity 的生命周期如下图:

(1)动静加载:
动静加载时,Activity 的 onCreate()调用完,才开始加载 fragment 并调用其生命周期办法,所以在第一个生命周期办法 onAttach()中便能获取 Activity 以及 Activity 的布局的组件;

(2)动态加载:
1. 动态加载时,Activity 的 onCreate()调用过程中,fragment 也在加载,所以 fragment 无奈获取到 Activity 的布局中的组件,但为什么能获取到 Activity 呢?

2. 原来在 fragment 调用 onAttach()之前其实还调用了一个办法 onInflate(),该办法被调用时 fragment 曾经是和 Activity 互相联合了,所以能够获取到对方,然而 Activity 的 onCreate()调用还未实现,故无奈获取 Activity 的组件;

3.Activity 的 onCreate()调用实现是,fragment 会调用 onActivityCreated()生命周期办法,因而在这儿开始便能获取到 Activity 的布局的组件;
**
3.4、与 Activity 通信 **
fragment 不通过构造函数进行传值的起因是因为横屏切换的时候获取不到值。

Activity 向 Fragment 传值:
Activity 向 Fragment 传值,要传的值放到 bundle 对象里;
在 Activity 中创立该 Fragment 的对象 fragment,通过调用 setArguments()传递到 fragment 中;
在该 Fragment 中通过调用 getArguments()失去 bundle 对象,就能失去外面的值。

Fragment 向 Activity 传值:
第一种:
在 Activity 中调用 getFragmentManager()失去 fragmentManager,,调用 findFragmentByTag(tag)或者通过 findFragmentById(id),例如:

`FragmentManager fragmentManager = getFragmentManager();

Fragment fragment = fragmentManager.findFragmentByTag(tag);
`
第二种:
通过回调的形式,定义一个接口(能够在 Fragment 类中定义),接口中有一个空的办法,在 fragment 中须要的时候调用接口的办法,值能够作为参数放在这个办法中,而后让 Activity 实现这个接口,必然会重写这个办法,这样值就传到了 Activity 中

Fragment 与 Fragment 之间是如何传值的:
第一种:
通过 findFragmentByTag 失去另一个的 Fragment 的对象,这样就能够调用另一个的办法了。

第二种:
通过接口回调的形式。

第三种:
通过 setArguments,getArguments 的形式。

3.5、api 区别
add
一种是 add 形式来进行 show 和 add,这种形式你切换 fragment 不会让 fragment 从新刷新,只会调用 onHiddenChanged(boolean isHidden)。

replace
而用 replace 形式会使 fragment 从新刷新,因为 add 形式是将 fragment 暗藏了而不是销毁再创立,replace 形式每次都是从新创立。

commit/commitAllowingStateLoss
两者都能够提交 fragment 的操作,惟一的不同是第二种办法,容许失落一些界面的状态和信息,简直所有的开发者都遇到过这样的谬误:无奈在 activity 调用了 onSaveInstanceState 之后再执行 commit(),这种异样时能够了解的,界面被零碎回收(界面曾经不存在),为了在下次关上的时候复原原来的样子,零碎为咱们保留界面的所有状态,这个时候咱们再去批改界面实践上必定是不容许的,所以为了防止这种异样,要应用第二种办法。

3. 懒加载
咱们常常在应用 fragment 时,经常会联合着 viewpager 应用,那么咱们就会遇到一个问题,就是初始化 fragment 的时候,会连同咱们写的网络申请一起执行,这样十分耗费性能,最现实的形式是,只有用户点开或滑动到以后 fragment 时,才进行申请网络的操作。因而,咱们就产生了懒加载这样一个说法。

Viewpager 配合 fragment 应用,默认加载前两个 fragment。很容易造成网络丢包、阻塞等问题。

在 Fragment 中有一个 setUserVisibleHint 这个办法,而且这个办法是优于 onCreate()办法的,它会通过 isVisibleToUser 通知咱们以后 Fragment 咱们是否可见,咱们能够在可见的时候再进行网络加载。

从 log 上看 setUserVisibleHint()的调用早于 onCreateView,所以如果在 setUserVisibleHint()要实现懒加载的话,就必须要确保 View 以及其余变量都曾经初始化完结,防止空指针。
**
应用步骤:**

申明一个变量 isPrepare=false,isVisible=false, 表明以后页面是否被创立了
在 onViewCreated 周期内设置 isPrepare=true
在 setUserVisibleHint(boolean isVisible)判断是否显示,设置 isVisible=true
判断 isPrepare 和 isVisible,都为 true 开始加载数据,而后复原 isPrepare 和 isVisible 为 false,避免反复加载。

收费获取 Android 进阶材料点击下方链接

https://shimo.im/docs/tXXKHgdjPYj6WT8d/

退出移动版