从朋友那里抢来个小米手机,安卓版本是api17,系统4.2,但是手机上显示居然是4.4.4,我也是呵呵了。
今天用这个低版本的手机测试我的的apk的时候,发现直接闪退崩溃了,而我定位不到问题所在,可以给大家看下报错的具体位置信息内容:
于是乎我就陷入了沉思当中,对!就是沉思!
诚然,矢量图的是谷歌在系统5.0推出的,所以在5.0以上的是没问题的,当时决定全面采用适量图的时候,因为没有低版本的测试机,所以我也犹豫了很久,不敢确定在低版本上会不会出现问题,今天正好出现了,其实按照官方的说法,想要兼容低版本的系统还是很简单的。ps:在这里就不做矢量图如何使用了,主要针对低版本进行下说明,但是我的这个问题严格上说确实不是低版本引起的兼容问题。
当时出现了崩溃,首先是想到的就是,可能是我在使用处理矢量图的时候不小心,使用方式出错了,导致在低版本上出现了崩溃,所以我就“好好的处理了一下”,更改了一些东西: 第一:
第二:
第三:在咱们的Activity中调用这句话: static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }
第四:就是正常的使用了,如果activity是继承ActivityCompat,那么咱们就用ImageView就好,会自动转成AppCompatImageView,如果非ActivityCompat,那就用AppCompatImageView,我为了慎重考虑,都用了AppCompatImageView,并在在java代码中我设置的背景都是采用了setImageResource的方式,设置图片如图:
其实内容就是这么多,我一直是这样配置和使用的,按照道理是没问题的,可是我依旧崩溃,有点方,有点慌张,有点。。。。。。那个。。。。
我采取了死磕的办法,第一步先看报错,肯定能找到蛛丝马迹,第二步再看下谷歌的官方文档吧。
然后我就发现了一个细节,我居然找到了,报错的一个细节
“You don’t have to use StateListDrawable. It also works with InsetDrawable, LayerDrawable, LevelListDrawable and RotateDrawable containers. The only rule is that the vector needs to be in a separate file.”
Emmmmmm我陷入了沉思当中,并且差点睡着。
在android官方推文中找到这句话 , 意味着,我们要在普通控件上使用Vector,就必须依附于StateListDrawable,InsetDrawable,LayerDrawable,LevelListDrawable,RotateDrawable,所以我来试试?
并且在布局中使用该方式的引用资源,这样就可以了吧,运行下,完美运行了!
关于矢量图的看法:首先可以完美的解决兼容问题,效果还是很显著的,当然一直都在说用矢量图完成自带动画有坑的这个问题我还没去尝试,不过如果借助矢量图设置控件的动画在运动过程中确实会出现失真的现象;在用矢量图的过程却是很麻烦考验耐心,图是一个个去导入,而且要自己手动的生成drawable文件目的就是解决我的上述问题(应该是包括布局背景textview和button都好像会出现问题),真的有点麻烦的说。匆忙的写完总结,赶紧下班了,有机会再说!