I'm using vector drawables in android prior to Lollipop and these are of some of my libraries and tool versions:
- Android Studio : 2.0
- Android Gradle Plugin : 2.0.0
- Build Tools : 23.0.2
- Android Support Library : 23.3.0
I added this property in my app level Build.Gradle
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
It is also worth mentioning that I use an extra drawable such as LayerDrawable(layer_list) as stated in Android official Blog (link here) for setting drawables for vector drawables outside of app:srcCompat
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/search"/>
</level-list>
You’ll find directly referencing vector drawables outside of app:srcCompat will fail prior to Lollipop. However, AppCompat does support loading vector drawables when they are referenced in another drawable container such as a StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable, and RotateDrawable. By using this indirection, you can use vector drawables in cases such as TextView’s android:drawableLeft attribute, which wouldn’t normally be able to support vector drawables.
When I'm using app:srcCompat
everything works fine, but when I use:
android:background
android:drawableLeft
android:drawableRight
android:drawableTop
android:drawableBottom
on ImageView
, ImageButton
, TextView
or EditText
prior to Lollipop, it throws an expection:
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9
Easiest way use :
and... just use
app:**Compat
for compatability. Also add support onbuild.gradle
(module)Guilherme P's suggestion was not working for me. I went ahead and made the decision to use png's where I need to do things outside of app:srcCompat i.e. drawableLeft, drawableRight, etc. This was a pretty easy change to make, and doesn't have the potential memory issues AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); introduces.
LATEST UPDATE - Jun/2019
Support Library has changed a bit since the original answer. Now, even the Android plugin for Gradle is able to automatically generate the PNG at build time. So, below are two new approaches that should work these days. You can find more info here:
Support Library
Probably, this is the solution that will work for you. If you came here, it means your Android Studio is not generating the PNGs automatically for you.. So, your app is crashing. PNG generation supports only a subset of XML elements. This solution, however, supports all xml tags. So, you have full support to your vector drawable.
You must first, update your build.gradle to support it:
And then, use
app:srcCompat
instead ofandroid:src
for vector drawables. Don't forget this.For
TextView
, if you are using theandroidx
version of the Support Library, you can useapp:drawableLeftCompat
(or right, top, bottom) instead ofapp:drawableLeft
If you are not using the
androidx
version of the Support Library and yourminSdkVersion
is17
or higher or using a button, you may try to set programmatically viaPNG Generation
Gradle can automatically create the PNG images for you at build time. However, in this approach, not all xml elements are supported. This solution is convenient because you don't need to change anything in your code or in your build.gradle. Just make sure you are using Android Plugin 1.5.0 or higher and Android Studio 2.2 or higher.
I'm using this solution in my app and works fine. No additional build.gradle flag necessary. No hacks is necessary. If you go to /build/generated/res/pngs/... you can see all generated PNGs.
So, if you have some simple icon (since not all xml elements are supported), this solution may work for you. Just update your Android Studio and your Android plugin for Gradle.
UPDATE - Jul/2016
They re-enabled that VectorDrawable in
Android Support Library 23.4.0
Maybe,
build.gradle
setting is now obsolete and you just need to enable it in proper activities (however, need to test).Now, to enable it, you must do:
Original Answer - Apr/2016
I think this is happening because Support Vector was disabled in the latest library version: 23.3.0
According to this POST:
If you visit issue ISSUE 205236, it seems that they will enable in the future but the memory issue will not be fixed soon:
I had a similar issue. So, in my case, I reverted all icons which use vector drawable from resource to PNG images again (since the memory issue will keep happening even after they provide an option to enable it again).
I'm not sure if this is the best option, but it fixes all the crashes in my opinion.
I am using VectorDrawables on Pre-lollipop devices and this is how I do it :-
Step 1: Put this in your app level gradle.
Step 2:
Put this in your Application class and don't forget to register your Application class in the manifest file.
Step 3:
Get VectorDrawables using,
The answer from Guillherme P is pretty awesome. Just to make a small improvement, you don't need to add that line in every activity, if you added it once in the Application class it will work as well.
REMEMBER: You still need to have enabled the use of the support library in gradle:
Also, make sure you are using a support library version greater than v23.4, when Google added back the support for Drawable Containers for VectorDrawables (release note)
Update
And for code changes:
app:srcCompat
every place that accepts theandroid:src
attribute (the IDE will warn you if it's invalid like for the<bitmap>
tag).For
drawableLeft
,drawableStart
,drawableRight
,drawableEnd
attributes used inTextView
and similar views, you will have to set them programmatically for now. An example of settingdrawableStart
:I had the same problem. And fix it by removing
My target version is 25 and support library is