I found there were numerous vector drawable crashes happened on pre-Lollipop devices and I can’t reproduce it.
One is caused by org.xmlpull.v1.XmlPullParserException: Binary XML file line #1: invalid drawable tag vector when I use setImageResource
android.content.res.Resources$NotFoundException: File res/drawable/ic_mylib_offline_tracks_32.xml from drawable resource ID #0x7f020414
at android.content.res.Resources.loadDrawable(Resources.java:2141)
at android.content.res.Resources.getDrawable(Resources.java:711)
at android.support.v7.widget.VectorEnabledTintResources.superGetDrawable(VectorEnabledTintResources.java:74)
at android.support.v7.widget.AppCompatDrawableManager.onDrawableLoadedFromResources(AppCompatDrawableManager.java:433)
at android.support.v7.widget.VectorEnabledTintResources.getDrawable(VectorEnabledTintResources.java:67)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:360)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:198)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:186)
at android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:100)
at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:85)
at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:93)
...
Code:
#override
protected void onBindItemViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
...
viewHoler.imageView.setImageResource(vectorResId);
...
}
Vector drawable - ic_mylib_offline_tracks_32.xml:
<vector android:height="24dp" android:viewportHeight="32.0"
android:viewportWidth="32.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#00000000" android:fillType="evenOdd"
android:pathData="M7,21v3.75c0,0.69 0.54,1.25 1.2,1.25h15.6c0.66,0 1.2,-0.56 1.2,-1.25V21M19,17l-3,2 -3,-2M16,6v12"
android:strokeColor="#A0A098" android:strokeLineCap="round"
android:strokeLineJoin="round" android:strokeWidth="1"/>
</vector>
And the others caused by android.content.res.Resources$NotFoundException: File res/drawable/ic_more_white_24.xml from drawable resource ID #0x7f020357. If the resource you are trying to use is a vector resource, you may be referencing it in an unsupported way. See AppCompatDelegate.setCompatVectorFromResourcesEnabled() for more info. when I refresh toolbar menu visibility.
android.content.res.Resources$NotFoundException: File res/drawable/ic_more_white_24.xml from drawable resource ID #0x7f020357. If the resource you are trying to use is a vector resource, you may be referencing it in an unsupported way. See AppCompatDelegate.setCompatVectorFromResourcesEnabled() for more info.
at android.content.res.Resources.loadDrawable(Resources.java:2096)
at android.content.res.Resources.getDrawable(Resources.java:700)
at android.support.v7.widget.VectorEnabledTintResources.superGetDrawable(VectorEnabledTintResources.java:74)
at android.support.v7.widget.AppCompatDrawableManager.onDrawableLoadedFromResources(AppCompatDrawableManager.java:435)
at android.support.v7.widget.VectorEnabledTintResources.getDrawable(VectorEnabledTintResources.java:67)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:353)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:200)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:188)
at android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:100)
at android.support.v7.view.menu.MenuItemImpl.getIcon(MenuItemImpl.java:491)
at android.support.v7.view.menu.ActionMenuItemView.initialize(ActionMenuItemView.java:125)
at android.support.v7.widget.ActionMenuPresenter.bindItemView(ActionMenuPresenter.java:210)
at android.support.v7.view.menu.BaseMenuPresenter.getItemView(BaseMenuPresenter.java:187)
at android.support.v7.widget.ActionMenuPresenter.getItemView(ActionMenuPresenter.java:196)
at android.support.v7.widget.ActionMenuPresenter.flagActionItems(ActionMenuPresenter.java:476)
at android.support.v7.view.menu.MenuBuilder.flagActionItems(MenuBuilder.java:1164)
at android.support.v7.view.menu.BaseMenuPresenter.updateMenuView(BaseMenuPresenter.java:95)
at android.support.v7.widget.ActionMenuPresenter.updateMenuView(ActionMenuPresenter.java:229)
at android.support.v7.view.menu.MenuBuilder.dispatchPresenterUpdate(MenuBuilder.java:291)
at android.support.v7.view.menu.MenuBuilder.onItemsChanged(MenuBuilder.java:1051)
at android.support.v7.view.menu.MenuBuilder.onItemVisibleChanged(MenuBuilder.java:1090)
at android.support.v7.view.menu.MenuItemImpl.setVisible(MenuItemImpl.java:651)
...
Code:
public void refreshMenuItemVisibility(boolean visibility) {
toolbar.getMenu().findItem(R.id.menu_overflow).setVisible(visible);
}
Vector drawable - ic_more_white_24.xml:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32.0"
android:viewportHeight="32.0">
<path
android:pathData="M10.5,16.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
android:fillType="evenOdd"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M16.5,16.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
android:fillType="evenOdd"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M22.5,16.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
android:fillType="evenOdd"
android:fillColor="#FFFFFF"/>
</vector>
I have already followed the step from the official document, but it doesn't work.
vectorDrawables.useSupportLibrary = true
public class MainActivity extends AppCompatActivity {
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
}
My library and tools version are as follow:
Android Support Library: 26.0.0
Build Tools: 26.0.0
Gradle: 3.3
Android Plugin: 2.3.3
UPDATE
All of the vectors are put in drawable folder.
Try this and see if working or not.
For me its working as i am using support library 23.4.0:
Add this to build.gradle
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
Add the following to onCreate of your Application class
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
For all xml views in which you are setting a vector drawable replace
android:src
with
app:srcCompat
and in the code replace this:
imageView.setImageResource(...);
with
imageView.setImageDrawable(...);
There are couple of things you need to fix.
1) First put your vector image in drawable folder instead of drawable-v24.
2) Also add support for vector drawables in gradle file.
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
3) There is also a work around for this. Make a resource file in your drawable folder and do something like this:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/Vector drawable"/>
</layer-list>
Related
I'm trying to build a Generated signed bundle in Android Studio but it doesn't work. It shows this error message.
270 exceptions were raised by workers:
A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$RunnableWrapperWorkAction
A failure occurred while executing
(and much longer)
Invalid color value ?attr/textcolor
This is my code below
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M18,6L6,18"
android:strokeLineJoin="round"
android:strokeWidth="2.5"
android:fillColor="#00000000"
android:strokeColor="?attr/textcolor"
tools:ignore="VectorRaster"
android:strokeLineCap="round"/>
<path
android:pathData="M6,6L18,18"
tools:ignore="VectorRaster"
android:strokeLineJoin="round"
android:strokeWidth="2.5"
android:fillColor="#00000000"
android:strokeColor="?attr/textcolor"
android:strokeLineCap="round"/>
</vector>
I am using ShapeableImageView in my XML as
<com.google.android.material.imageview.ShapeableImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="#drawable/ic_unread_msg"
/>
I am getting Resource not found exception when I run the app on OS 5 and 6
Caused by android.content.res.Resources$NotFoundException: File res/drawable/ic_unread_msg.xml from drawable resource ID #0x7f0700f7
at android.content.res.Resources.loadDrawableForCookie(Resources.java:2850)
at android.content.res.Resources.loadDrawable(Resources.java:2732)
at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
at android.widget.ImageView.<init>(ImageView.java:152)
at android.widget.ImageView.<init>(ImageView.java:140)
at androidx.appcompat.widget.AppCompatImageView.<init>(AppCompatImageView.java:74)
at com.google.android.material.imageview.ShapeableImageView.<init>(ShapeableImageView.java:96)
at com.google.android.material.imageview.ShapeableImageView.<init>(ShapeableImageView.java:92)
at java.lang.reflect.Constructor.newInstance(Constructor.java)
Caused by android.content.res.Resources$NotFoundException: File res/drawable/$ic_unread_msg__0.xml from color state list resource ID #0x7f07000b
at android.content.res.Resources.loadColorStateListForCookie(Resources.java:2960)
at android.content.res.Resources.loadColorStateList(Resources.java:2909)
at android.content.res.TypedArray.getColor(TypedArray.java:439)
at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:1605)
at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1584)
at android.graphics.drawable.VectorDrawable.inflateInternal(VectorDrawable.java:666)
at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:571)
Caused by org.xmlpull.v1.XmlPullParserException: Binary XML file line #9: invalid color state list tag gradient
at android.content.res.ColorStateList.createFromXmlInner(ColorStateList.java:217)
at android.content.res.ColorStateList.createFromXml(ColorStateList.java:201)
at android.content.res.Resources.loadColorStateListForCookie(Resources.java:2956)
at android.content.res.Resources.loadColorStateList(Resources.java:2909)
at android.content.res.TypedArray.getColor(TypedArray.java:439)
This is my vector image
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="14dp"
android:height="14dp"
android:viewportWidth="14"
android:viewportHeight="14">
<path android:pathData="M7,0L7,0A7,7 0,0 1,14 7L14,7A7,7 0,0 1,7 14L7,14A7,7 0,0 1,0 7L0,7A7,7 0,0 1,7 0z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="7"
android:endY="14"
android:startX="7"
android:startY="0"
android:type="linear">
<item
android:color="#FF63D8FF"
android:offset="0" />
<item
android:color="#FF6397FF"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
</vector>
Can't figure out why the crash is happening?
Thanx to Sandi's comment
Replacing android:src with app:srcCompat works
I have the following situation: I have a constraint layout with background:
<androidx.constraintlayout.widget.ConstraintLayout
android:id="#+id/cl_wave_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#drawable/ic_wave_header_svg_drawable"
android:paddingBottom="41dp"
app:layout_constraintTop_toTopOf="parent">
Here's the ic_wave_header_svg_drawable:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/ic_wave_header" />
</layer-list>
Here's the ic_wave_header:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
xmlns:tools="http://schemas.android.com/tools"
android:width="328dp"
android:height="199dp"
android:viewportWidth="328"
android:viewportHeight="199"
tools:ignore="VectorRaster">
<path
android:fillType="evenOdd"
android:pathData="M328,198.147C328,198.147 287.806,164.737 164,168.868C40.194,172.999 0,140 0,140V198.147V0H328L328,198.147Z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="351.346"
android:endY="198.147"
android:startX="351.346"
android:startY="-28.2069"
android:type="linear">
<item
android:color="#FF9DDE10"
android:offset="0" />
<item
android:color="#FF82BD00"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
</vector>
When I run the app, it crashes on android 6.0 and lower. In the other versions, it works correctly. What's the problem and how can I solve it?
UPD
Error log:
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_wave_header.xml from drawable resource ID #0x7f080180
at android.content.res.Resources.loadDrawableForCookie(Resources.java:2640)
at android.content.res.Resources.loadDrawable(Resources.java:2540)
at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
at android.graphics.drawable.LayerDrawable.updateLayerFromTypedArray(LayerDrawable.java:296)
at android.graphics.drawable.LayerDrawable.inflateLayers(LayerDrawable.java:239)
at android.graphics.drawable.LayerDrawable.inflate(LayerDrawable.java:164)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1215)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1124)
at android.content.res
It seems that it is something incorrect with drawable, but if it is right, why it doesn't crash on other devices
In your application class -> enable setCompatVectorFromResourcesEnabled
public class App extends Application {
#Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);//add this
}
This crash is caused by using
android:offset="0" in svg file of your drawable.
To fix this you can either avoid using android:offset="0" in svg file (by using plain color instead of gradient) or you can use .png format of your drawable image for quick fix.
We use Bitbucket and after the last commit, vector images don't work.
12-03 12:48:58.214 26158-26158/linegraphapp.linegraphapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: linegraphapp.linegraphapp, PID: 26158
android.content.res.Resources$NotFoundException: Resource ID #0x7f060064
at android.content.res.Resources.getValue(Resources.java:1378)
If I create the same button in my local copy, all works fine.
what could be wrong?
My layout:
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".AddPicture">
<item
android:id="#+id/plus_btn"
android:icon="#drawable/plus_btn"
android:orderInCategory="2"
android:title="Add"
app:showAsAction="always"></item>
</menu>
Button code:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="34dp"
android:height="34dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFF"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM17,13h-4v4h-2v-4L7,13v-2h4L11,7h2v4h4v2z"/>
If it needs, I will add full stack trace.
project structure
I use compileSdkVersion 26 and Android Studio 3.2.1
We have a drawable file already in drawable v21 also for ripple effect.
So why we use drawable v24 when we are getting vector file already.
Below is the xml File ic_launcher_foreground.xml.
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeColor="#00000000"
android:strokeWidth="1">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0"/>
<item
android:color="#00000000"
android:offset="1.0"/>
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11
40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81
70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76
60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeColor="#00000000"
android:strokeWidth="1"/>
</vector>
The different drawable folders are for providing different screen densities for device compatibility and for different Android versions.
See this answer for more details