ViewCompat在Android中有什么用

  介绍

ViewCompat在Android中有什么用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

<强>详解Android ViewCompat的作用

ViewCompat类主要是用来提供兼容性的,比如我最近看的比较的多的canScrollVertically方法,在ViewCompat里面针对几个版本有不同的实现,原理上还是根据版本判断,有时甚至还要判断传入参数的类型。但是要注意的是,ViewCompat仅仅让你调用不崩溃,并不保证你调用的结果在不同版本的机器上一致。

关于如何优雅的组织代码,ViewCompat类的结构非常适合我们参考。

ViewCompat里面定义了一个接口,这个接口列出了所有它支持的方法

静态最终ViewCompatImpl IMPL;
  静态{
  最后一个int版本=android.os.Build.VERSION.SDK_INT;
  如果(版本祝辞=21){
  IMPL=new LollipopViewCompatImpl ();
  }else if(版本祝辞=19){
  IMPL=new KitKatViewCompatImpl ();
  }else if(版本祝辞=17){
  IMPL=new JbMr1ViewCompatImpl ();
  }else if(版本祝辞=16){
  IMPL=new JBViewCompatImpl ();
  }else if(版本祝辞=14){
  IMPL=new ICSViewCompatImpl ();
  }else if(版本祝辞=11){
  IMPL=new HCViewCompatImpl ();
  }else if(版本祝辞=9){
  IMPL=new GBViewCompatImpl ();
  }else if(版本祝辞=7){
  IMPL=new EclairMr1ViewCompatImpl ();
  其他}{
  IMPL=new BaseViewCompatImpl ();
  }
  }

这样我们就得到了针对各个版本的不同实现。

但是有些方法的实现在跨越几个版本的时候是不变的,有些方法又有可能每次都变,如何实现高效的代码复用呢,# 63;那就是继承+重写。

比如BaseViewCompatImpl这个类是基类,实现ViewCompatImpl接口,把所有的方法都实现一次

静态类BaseViewCompatImpl实现ViewCompatImpl {
  ……
  公共布尔canScrollHorizontally (v, int方向){
  返回(v instanceof ScrollingView),,
  canScrollingViewScrollHorizontally (v (ScrollingView),方向);
  }
  公共布尔canScrollVertically (v, int方向){
  返回(v instanceof ScrollingView),,
  canScrollingViewScrollVertically (v (ScrollingView),方向);
  }
  ……
  @Override
  公共布尔isOpaque(查看视图){
  最后可拉的bg=view.getBackground ();
  如果(bg !=null) {
  返回bg.getOpacity ()==PixelFormat.OPAQUE;
  }
  返回错误;
  }
  ……
  }

但是这些实现基本上都是空的,或者无效的,或者是一些解决方案,这也很正,常因为确实不可能让每个方法都做到兼容,只能尽量让他的版本支持多一点,兼容性方法本来就有很多问题。以上面这三个方法为例,前两个方法都是api 14出现的方法,在14日以下基本上等于是直接返回了错误(这里低版本是仅对ScollingView提供了支持,ScollingView有三个基类,其中一个是RecyclerView),谷歌显然没有想到什么好的方法在低版本提供对这个方法的支持,所以干脆就在api小于14时一直使用这个实现,而isOpaque则是类似解决的方法,在api 7时,isOpaque被正式添加到视图类中,所以在api 7我们可以直接调视图的isOpaque,那么应该怎么写代码呢,# 63;应当新建一个类,继承BaseViewCompatImpl,重写isOpaque方法,也就是下面这样:

静态类EclairMr1ViewCompatImpl延伸BaseViewCompatImpl {
  @Override
  公共布尔isOpaque(查看视图){
  返回ViewCompatEclairMr1.isOpaque(查看);
  }
  
  ……
  }

而其他没有更好兼容方案的方法我们都不管,那么api 9如果某些方法又有了更好的实现,或者可以直接调用系统的api了,就再新建一个类GBViewCompatImpl,这个类需要继承EclairMr1ViewCompatImpl。

同理,我们在api 14对应的类ICSViewCompatImpl中自然就会看到canScrollHorizontally和canScrollVertically的新的实现,而ICSViewCompatImpl必然继承自HCViewCompatImpl。

就这样慢慢的演化,像串铜钱一样,每一个新的类对应一个新的版本(版本之间不需要连续),同时继承自前一个版本的类,在实现类的继承树上越接近叶子,这个实现类的能力就越强。

ViewCompat在Android中有什么用