Android Support 23.3.0 中對vector的支持

現(xiàn)象

Support包升級(jí)到23.3.0后,在5.0之前的機(jī)器上,對ImageView設(shè)置src,或者對AppCompatImageView設(shè)置app:srcCompat(item為vector的select資源),應(yīng)用程序會(huì)crash。

根據(jù)Google的介紹:

For AppCompat users, we’ve decided to remove the functionality which let you use vector drawables from resources on pre-Lollipop devices due to issues found in the implementation in version 23.2.0/23.2.1 [https://goo.gl/u5suZB, https://goo.gl/fW5Tyd]. Using app:srcCompat and setImageResource() continues to work.

由于存在bug,在23.3.0中已經(jīng)移除了在pre-Lollipop設(shè)備上使用資源獲取vector drawable的支持。

分析

根據(jù)應(yīng)用的crash報(bào)告:

Caused by android.content.res.Resources$NotFoundException
android.content.res.Resources.loadDrawable (Resources.java:1923)
android.content.res.Resources.getDrawable (Resources.java:664)
android.graphics.drawable.StateListDrawable.inflate (StateListDrawable.java:173)
android.graphics.drawable.Drawable.createFromXmlInner (Drawable.java:867)

以上為部分堆棧

select對應(yīng)到會(huì)創(chuàng)建StateListDrawable實(shí)例,并會(huì)分析該xml中的item創(chuàng)建相應(yīng)的drawable。

我們都知道,當(dāng)我們使用Support包時(shí)并將我們的Activity繼承AppCompatActivity時(shí),在setContentView的時(shí)候會(huì)使用AppCompatViewInflater來創(chuàng)建View,將TextView實(shí)例化成AppCompatTextView,將ImageView實(shí)例化成AppCompatImageView。

而在AppCompatImageView的構(gòu)造函數(shù)中,會(huì)通過TintContextWrapper來使用TintResources劫持Resouces的getDrawable方法。

而在23.2.0中,該方法的代碼如下:

@Override
public Drawable getDrawable(int id) throws NotFoundException {
    return  AppCompatDrawableManager.get().onDrawableLoadedFromResources(mContext, this, id);
}

會(huì)直接調(diào)用AppCompatDrawableManager.get,使得在5.0之前的版本也支持vectorDrawable。

而在23.3.0中,該方法代碼修改如下:

@Override
public Drawable getDrawable(int id) throws NotFoundException {
    Drawable d = super.getDrawable(id);
    Context context = mContextRef.get();
    if (d != null && context != null) {
        AppCompatDrawableManager.get().tintDrawableUsingColorFilter(context, id, d);
    }
    return d;
}

會(huì)先調(diào)用super的getDrawable方法,由于在5.0之前的版本中,Drawable找不到vector標(biāo)簽,拋出了NotFoundException導(dǎo)致應(yīng)用的crash。

而5.0之后的版本,Drawable已經(jīng)支持vector表情的解析了,所以不存在這個(gè)問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評(píng)論 25 708
  • Android Vector曲折的兼容之路 兩年前寫書的時(shí)候,就在研究Android L提出的Vector,可研究...
    eclipse_xu閱讀 35,102評(píng)論 30 263
  • 今天我在看某腦SVG視頻和網(wǎng)上查資料時(shí),發(fā)現(xiàn)了和某位大佬的寫文章的某種巧合(報(bào)以微妙的笑容)。因?yàn)閺?qiáng)迫癥,所以我想...
    仁昌居士閱讀 4,764評(píng)論 0 11
  • 1、屈臣氏發(fā)展情況:擁有3000家門店,總營收和同店銷售額下降,但利潤率高 1)門店數(shù)量發(fā)展兇猛:十年前在中國30...
    蘇公子的人生航道閱讀 842評(píng)論 1 1
  • 曖昧,這兩個(gè)字念起來都是唇齒黏膩。 那天你來看我,我們逛了一天,吃了一天,直到華燈初上,你需要緊緊摟著我來幫我扛風(fēng)...
    S蘇蘇S閱讀 302評(píng)論 0 0