Android4.4 及如下TextView,Button等控件使用矢量圖報錯

平常夜拍

1 問題描述

最近項目開發中,圖標資源我儘可能使用了矢量圖,然而配置了基本的兼容設置,程序在低版本中運行仍是出現了問題。java

xml佈局文件中,在TextView中使用矢量圖,好比android:drawableStart,android:drawableStart這些屬性直接引用矢量圖資源。這樣在Android5.0及以上是沒問題的,可是5.0如下就拋出找不到圖片資源的問題。android

2 緣由

support庫並無爲AppcompatTextView,AppcompatButton等控件適配設置矢量圖屬性,反正我就記得ImageView,ImageButton有srcCompat屬性就是適配了的。api

3 解決方案

基礎配置(必須):佈局

1 在gradle里加上vectorDrawables 兼容支持gradle

android {
    ...
    defaultConfig {
        ...
       vectorDrawables.useSupportLibrary = true 
    }
    ...
}

2 在Application或者Activity上加上AppCompateDelegate開啓CompatVectorFromResources支持ui

/**
     * vector兼容5.0如下系統
     */
    static {
        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        if (currentapiVersion < 21){
            //適配android5.0如下
            AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        }
    }

方案1:矢量圖包裝爲selector

若是將就Android4.4,Button就不能用矢量圖,要用位圖,那還叫錘子的兼容支持,我也不知道Google官方爲毛不在兼容控件上多加幾個支持屬性。spa

參考stackOverFlow的回答,Button,TextView,應用矢量圖,保險的是先把矢量圖轉爲selector,而後selector代替矢量圖使用,我以爲這是最佳的辦法。設計

例如:code

<Button
        style="@style/SettingItemTheme"
        android:layout_width="match_parent"
        android:layout_height="@dimen/setting_item_height"
        android:text="@string/my_setting"
        android:id="@+id/my_btn_setting"
        android:drawableStart="@drawable/selector_setting"
        android:drawableEnd="@drawable/selector_right"/>

selector_setting.xmlxml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_my_setting"/>
</selector>

這裏android:drawableStart,android:drawableEnd,我引用的是selector,可是selector裏面就是一個默認的矢量圖,但用這種方式佈局,在Android4.4下運行程序就不會報錯。

方案2:不支持的就使用位圖

若是項目作了大半,忽然說以前的矢量圖不能用,要改成位圖,這是很崩潰的。

4 擴展:爲何我要用矢量圖,而不是位圖

最多見的設置界面:

我不知道各位實現設置Item的方式是怎樣的,我實現UI的原則是能用一個控件實現就用一個實現,因此Item我用一個Button控件就實現了。Button,TextView自帶drawableStart屬性,能夠在上下左右放圖標,因此何須要用LinearLayout包三個控件實現呢。

例如:

<Button
        style="@style/SettingItemTheme"
        android:layout_width="match_parent"
        android:layout_height="@dimen/setting_item_height"
        android:text="@string/my_vehicle_manage"
        android:id="@+id/my_btn_vehicle_manage"
        android:drawableStart="@drawable/selector_vehicle_manage"
        android:drawableEnd="@drawable/selector_right"/>

可是若是drawableStart引用的是位圖,這樣圖標的大小就很難調節,老是要找設計師從新切圖,麻煩。可是用vector向量圖就能夠經過android:width,android:height調大小,這對開發來講很方便。

相關文章
相關標籤/搜索