android fragment和viewpager 面试题

414 阅读3分钟
  • 1.Fragment的生命周期 & 结合Activity的生命周期 onAttach:关联activity,与activity相互绑定。

onCreate:是fragment的onCreate,用来创建fragment。

onCreateView:是创建fragment的布局。

onActivityCreate:此时activity的onCreate已经走完,在此生命周期可以获取到activity对象,获取到activity中的资源。上面三个不能获取到activity资源

onStart:与activity绑定,和activity的onStart方法一起走。

onResume:与activity绑定,和activity的onResume方法一起走。

onPause:与activity绑定,和activity的onPause方法一起走。

onStop:与activity绑定,和activity的onStop方法一起走。

  • 2.Activity和Fragment的通信方式, Fragment之间如何进行通信

image.png

订阅观察者模式,发送方通过LivedataBus.newInstence.with("key",string.class).postValue("value")送送给livedatabus键为“key”的观察者中,通过livedatabus。getInstence.with("key",string.clss).observe(this,new observer(){ @Override public void onChanged(string msg){ //处理消息 })

image.png

  • 3.为什么使用Fragment.setArguments(Bundle)传递参数,而不推荐通过构造方法直接来传递参数 当横竖屏切换时,最终会通过反射无参构造实例化一个新的Fragment,并且给mArgments初始化为原先的值,而原来的Fragment实例的数据都丢失了,并重新进行了初始化

通过上面的分析,我们可以知道Activity重新创建时,会重新构建它所管理的Fragment,原先的Fragment的字段值将会全部丢失,但是通过 Fragment.setArguments(Bundle bundle)方法设置的bundle会保留下来。所以尽量使用Fragment.setArguments(Bundle bundle)方式来传递参数

  • 4.FragmentPageAdapter和FragmentStatePageAdapter区别及使用场景

使用FragmentPageAdapter适配器的时候,每次切换页面的的时候,他会持久化数据,即时Fragment被系统销毁,数据也会保存在内存中,所有它不能用来加载大数据量的数据。

使用FragmentStatePageAdapter适配器的时候,他每次切换页面的的时候,会销毁Fragment仅仅保存Fragment的引用,适合加载大数据量的数据 。 FragmentPageAdapter 相对静态的页,数量也比较少;

FragmentStatePageAdapter 需要处理很多页,并且数据动态性较大、占用内存较多的情况;

  • 5.Fragment懒加载

以前处理 Fragment 的懒加载,我们通常会在 Fragment 中处理 setUserVisibleHint + onHiddenChanged 这两个函数,而在 Androidx 模式下,我们可以使用 FragmentTransaction.setMaxLifecycle() 的方式来处理 Fragment 的懒加载。

  • 6.ViewPager2与ViewPager区别

  • FragmentStateAdapter替换了原来的 FragmentStatePagerAdapter

  • RecyclerView.Adapter替换了原来的 PagerAdapter

  • registerOnPageChangeCallback替换了原来的 addPageChangeListener

FragmentStateAdapter和FragmentStatePagerAdapter作用相同, 可以用viewpager来管理fragment, 区别在于viewpager2的FragmentStateAdapter与recycleview的生命周期绑定

另外viewpager2的Adapter是继承自recyclerview的adapter, 支持除了notifyDataSetChanged()以外的notifyItemChanged(int position)等方式, 使用上更加的便捷

  1. 使用,viewpager2放在AndroidX的库中
  • 7.Fragment嵌套问题 尽量避免Fragment嵌套Fragment。有这方面的限制的原因,是Fragment管理器对象限制的问题。getSupportFragmentManager获取到的管理器在这次的项目中仅仅只能支持到二级的Fragment,如果二级的Fragment容器有两个以上,那么很遗憾,第二个之后的Fragment容器将不会显示任何的Fragment内容。

FragmentB中的嵌套不能再用getActivity().getSupportFragmentManager();要用getChildFragmentManager();