Fragment和ViewPager的介绍和使用

一、Fragment的介绍

在之前的学习和介绍中,已经介绍过Android中存在的碎片化的问题,并提出了一系列的适配方法和方案。为了解决碎片化的问题,在Android中提出了Fragement的概念,用于灵活适配不同的尺寸屏幕。

Fragment的英文单词的本意即是碎片、碎块、片段的意思,非常吻合Android中的碎片化概念。

具体来说,Fragment是Activity界面中的一部分,可理解为模块化的Activity。

特点

同Activity一样,依然来看一下Fragment有哪些特点:

  • Fragment无法独立存在,需要嵌入到Activity中。可以理解为“寄生”在Activity中。
  • Fragment具有自己的生命周期,接收它自己的事件,并可以在Activity运行时被添加或删除。
  • Fragment的生命周期直接受所在的Activity的影响。比如:当Activity暂停时,它拥有的所有Fragment们都暂停。

生命周期

同Activity一样,Fragment的生命周期的管理依然是通过一系列的方法实现的。主要的一些方法如下所示:

  • onAttach:Fragment和Activity建立关联的时候调用(获得activity的传递的值)。
  • onCreateView:为Fragment创建视图即加载布局时调用。
  • onActivityCreated:当Activity中的onCreate方法执行完后调用。
  • onDestroyView:Fragment中的布局被移除时调用,即fragment销毁相关联的UI布局。
  • onDetach:Fragment和Activity解除关联的时候调用,即Fragment脱离了activity。

生命周期举例

  • 当一个fragment被创建的时候,会执行:onAttach()、onCreate()、onCreateView()、onActivityCreated()
  • 当一个fragment对用户可见的时,会执行:onStart()、onResume()
  • 当一个fragment进入“后台模式”的时候,会执行:onPause()、onStop()
  • 当一个fragment被销毁时,或者持有它的activity被销毁时,会执行:onPause、onStop、onDestroyView、onDestroy、onDetach。

使用方法

由于Fragment作为Activity一部分,所以Fragment的使用一般是添加到Activity中,可以有两种方法:

  • 在Activity的layout.xml布局文件中静态添加
  • 在代码中动态添加

常用的是第二种,在代码中进行添加和管理。

Fragment常用的API

Fragment常用的API有三个类:

  • Fragment:用于定义Fragment,前文的生命周期等均是在Fragment中编写实现
  • FragmentManager:主要用于在Activity中操作Fragment,可以理解为Fragment管理器,可以通过getFragmentManager方法在activity中获取。
  • getSupportFragmentManager:支持包中的Fragment管理器的方法,正常开发均使用该方法,适用性好。
  • getSupportFragmentManager:在Fragment中管理Fragment的时候,使用该方法。
  • FragmentTransaction: 保证一些列Fragment操作的原子性,可以借助于数据库操作时的事务来理解该概念。包含有add、remove、replace、hide、show、detach、attach等方法,另外还有commit方法。

二、ViewPager的介绍和使用

ViewPager是android扩展包中的类,这个类可以让用户左右切换当前的view,常见于各大App中的轮动广告,Banner图等。ViewPager和ListView既有相似,也有不同,原因是:

  • 不同点:ViewPager类直接继承了ViewGroup类,因此ViewGroup是一个容器类,可以在其中添加其他的view类。
  • 相同点:ViewPager同ListView一样,均需要一个适配器提供数据。在ViewPager的使用过程中,需要一个PagerAdapter适配器类给它提供数据。

PagerAdapter适配器

PagerAdapter是一个基类适配器,我们经常用它来实现app引导图,它的子类有FragmentPagerAdapter和FragmentStatePagerAdapter,这两个子类适配器用于和Fragment一起使用,在安卓应用中它们就像listview一样出现的频繁。当然更多的时候还可以继承自PagerAdapter来实现开发者的自定义适配器,继承PagerAdapter,同样需要对一些方法进行实现和重写:

  • getCount():该方法必须实现,表示一共有多少个item,跟ListView适配器中作用一样。
  • isViewFromObject(View view, Object object):判断instantiateItem(ViewGroup, int)函数所返回来的Key与一个页面视图是否是 代表的同一个视图(即它俩是否是对应的,对应的表示同一个View),通常我们直接写 return view == object即可。
  • instantiateItem(ViewGroup container, int position):将给定位置的view添加到ViewGroup(容器)中,创建并显示出来 ②返回一个代表新增页面的Object(key),通常都是直接返回view本身就可以。
  • destroyItem(ViewGroup container, int position, Object object) :移除一个给定位置的页面,适配器需要从容器中删除这个视图,主要是为了确保在finishUpdate(viewGroup)返回时视图能够被移除。

三、Fragment和ViewPager的结合

在Android开发中,经常会使用Fragment+Viewpager结合来做一些多页面的切换和滑动操作,屡试不爽。其原理就是在ViewPager中展示Fragment即可。

FragmentPagerAdapter

当ViewPager用于展示Fragment时,有一个特殊的适配器,系统提供的是基类:FragmentPagerAdapter。在实际使用时需要自己基于该类,进行自定义实现。比如如下的实现:

class MyFragmentPagerAdapter extends FragmentPagerAdapter{
  public MyFragmentPagerAdapter(@NonNull FragmentManager fm) {
  super(fm);
  }
​
  @NonNull
  @Override
  public Fragment getItem(int position) {
  return mFragmentList.get(position);
  }
​
  @Override
  public int getCount() {
  return mFragmentList.size();
  }
}

相较于PagerAdapter,FragmentPagerAdapter的自定义要简单一些。

四、总结

在Android开发中,一些多页面切换时,使用ViewPager和fragment效果很好。同时,还可以自定义实现滑动切换效果,效果也很丰富,此处不再赘述,大家了解该知识点,如果在开发中需要,了解如何解决即可。

另外一点,ViewPager展示多页面时,往往对内存消耗也是一个挑战,所以优化如何节省内存也是使用ViewPager + Fragment的很重要的一个工作。

你可能感兴趣的:(Fragment和ViewPager的介绍和使用)