Using android vector Drawables on pre Lollipop crash
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:
PNG Generation
Gradle can automatically create PNG images from your assets 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.
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. So, your app is crashing.
Or maybe, you don't want Android Studio to generate any PNG at all.
Differently from that "Auto-PNG generation" which supports a subset of XML element, this solution, supports all xml tags. So, you have full support to your vector drawable.
You must first, update your build.gradle to support it:
android {
defaultConfig {
// This flag will also prevents Android Studio from generating PNGs automatically
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
// Use this for Support Library
implementation 'com.android.support:appcompat-v7:23.2.0' // OR HIGHER
// Use this for AndroidX
implementation 'androidx.appcompat:appcompat:1.1.0' // OR HIGHER
}
And then, use app:srcCompat
instead of android:src
while loading VectorDrawables
. Don't forget this.
For TextView
, if you are using the androidx
version of the Support Library, you can use app:drawableLeftCompat
(or right, top, bottom) instead of app:drawableLeft
In case of CheckBox
/RadioButton
, use app:buttonCompat
instead of android:button
.
If you are not using the androidx
version of the Support Library and your minSdkVersion
is 17
or higher or using a button, you may try to set programmatically via
Drawable icon = AppCompatResources.getDrawable(context, <drawable_id>);
textView.setCompoundDrawablesWithIntrinsicBounds(<leftIcon>,<topIcon>,<rightIcon>,<bottomIcon>);
UPDATE - Jul/2016
They re-enabled that VectorDrawable in
Android Support Library 23.4.0
For AppCompat users, we’ve added an opt-in API to re-enable support Vector Drawables from resources (the behavior found in 23.2) via AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) - keep in mind that this still can cause issues with memory usage and problems updating Configuration instances, hence why it is disabled by default.
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:
public class MainActivity extends AppCompatActivity {
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
...
}
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:
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 (ISSUE 205236). Using app:srcCompat and setImageResource() continues to work.
If you visit issue ISSUE 205236, it seems that they will enable in the future but the memory issue will not be fixed soon:
In the next release I've added an opt-in API where you can re-enable the VectorDrawable support which was removed. It comes with the same caveats as before though (memory usage and problems with Configuration updating).
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.
Android support library v4:22+ crashing pre Lollipop on attr/ in drawables
<solid android:color="?attr/colorPrimary"/>
Points to a private color (was not public) in Android code, maybe it doesn't exist in some API.
While <solid android:color="@color/primary"/>
will point to a color in your project, maybe you have a color name primary
only in folder values-v21 so it's only crashing in versions below 5.0
I think you should try using this:<solid android:color="@android:attr/colorPrimary"/>
to make sure the attribute exists.
Hope this helps.
vector Drawable icons crashed in android 6
you need to add vectorDrawables.useSupportLibrary = true
to your build.gradle
file
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
app:srcCompat
is the most foolproof method of integrating vector drawables into your app.Vector drawables allow you to replace multiple png assets with a single vector graphic, defined in XML. While previously limited to Lollipop and higher devices
Related Topics
Android - Webview Language Changes Abruptly on Android 7.0 and Above
How to Integrate Opencv Manager in Android App
Navigation Drawer (Google+ VS. Youtube)
Showing Empty View When Listview Is Empty
Get JSONarray Without Array Name
Differences Between Textwatcher 's Ontextchanged, Beforetextchanged and Aftertextchanged
What's Dp (Density Independent Pixels) Units with CSS
How to Programmatically Scroll a Scroll View to a Specific Edit Text
Android: How to Convert String to Date
Firebase (Fcm): Open Activity and Pass Data on Notification Click. Android
Android - Application (Apk) Maximum Size
How to Rotate the Android Emulator Display
Android - How to Download a File from a Webserver
Checking Toast Message in Android Espresso
Error: "Adb Connection Error:An Existing Connection Was Forcibly Closed by the Remote Host"