Fragment

Fragment(碎片)可以理解为activity中界面的一部分,我们可以将多个fragment组合起来放到activity中,或者在多个activity中重用一个fragment。

一、Fragment为什么被称为第五大组件?

首先在使用频率上,fragment不低于其他四大组件,而且它有自己的生命周期。使用fragment比activity更加节省内存,同时,它可以很灵活的加载到activity中,所以它被称为第五大组件。虽然它有自己的生命周期,但是它必须依附于宿主activity存在。

二、Fragment加载到activity中的两种方式?

  • 静态加载:在activity的布局文件中以标签的形式添加fragment。
  • 动态加载:在java文件中以代码的形式加载fragmet。
    • 1、获取FragmentManager管理者对象;
    • 2、通过上述对象的beginTranscation()方法创建FragmentTranscation对象;
    • 3、通过transcation对象的add()/remove()/replace()/hide()/show()等方法来显示或者移除fragment;
    • 4、通过transcation对象的commit()方法来提交。

总结起来就是如下两行代码:
getFragmentManager().beginTranscation().add()
getFragmentManager().beginTranscation().commit()

注意:
1、同一个fragment只能被add一次;
2、同一个transcation只能被提交一次;
3、transcation.addToBackStack(null)将碎片添加到返回栈中,此时按下返回键,不会退出程序,而是返回上一个碎片。

三、fragmentPagerAdapter和fragmentStatePagerAdapter的区别?

fragmentPagerAdapter在destroyItem()的时候调用的是detach()方法,只是把UI进行了分离,并没有真正的移除fragment,所以只适用于页面较少的情况。而fragmentStatePagerAdapter在切换页面的时候调用的是remove()方法,是真正回收内存的,所以它适用于页面较多的情况。

四、fragment的生命周期?

onAttach()–>onCreate()–>onCreateView()–>onViewCreate()–>activity.onCreate()–>onActivityCreate()–>activity.onStart()–>activity.onResume()–>activity.onPause()–>activity.onStop()–>onDestroyView()–>onDetach()

这里写图片描述

五、fragment与activity之间的传值通信?

1、fragment向activity之间的传值:

  • 在fragment中通过getActivity()获取activity的对象,然后调用activity中的方法;
  • 接口回调:在fragment中设置一个接口,然后让activity实现这个接口,这样就可以在接口中将数据传递给activity.

2、activity向fragment传值:

  • 在 activity中创建Bundle数据包,通过putExtra()方法将数据放进去,然后调用fragment对象的setArguments(bundle)方法,在fragment中就可以通过getArguments()方法获取数据。
  • 在activity中通过getFragmentManager.findFragmentById()获取fragment对象,然后就可以调用fragment的方法了。

3、fragment与fragment传值:

  • 在第一个fragment中调用getActivity().getFragmentManager().findFragmentById()获取第二个fragment的对象,然后调用第二个fragment中的方法;
  • 接口回调:在fragment1中设置一个接口,宿主activity实现这个接口,fragment1在接口中与activity实现通信,然后在activity中的回调方法中,实现与fragment2的通信。

总结:fragment与activity通信的关键点就是要拿到对方的对象,fragment通过getActivity()获取activity的对象,activity通过getFragmentManager().getFragmentById()来获取fragment对象。fragment与activity之间可以直接通信,而fragment之间必须通过activity这个宿主来实现通信。

最后再说几句

实际开发中,fragment一般用于主界面的tab切换,我们一般用一个ArrayList集合来存放我们想要显示的所有fragment,然后通过transcation的show()方法来显示我们想要的fragment,通过transcation的hide()方法来隐藏其他的fragment。

关于fragment的面试题基本上就是这么多了,如果还有我没有注意到的,欢迎大家给我留言告诉我,我会实时进行更新。(^▽^)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值