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