Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Resources$NotFoundException from drawable resource for older phones API 18

I'm running into the following error only when testing on a Samsung Galaxy Nexus phone with Android 4.3 and API 18.

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_error.xml
 from drawable resource ID #0x7f020098
    at android.content.res.Resources.loadDrawable(Resources.java:2091)
    at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
    at android.widget.TextView.<init>(TextView.java:803)
    at android.widget.EditText.<init>(EditText.java:60)

In my Acitivty.java file, I've tried using the following methods to set my vector drawable:

editTextNickname.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_error, 0);
editTextNickname.setCompoundDrawables(null, null,
    ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_error), null);

I'm using the latest support libraries in my build.gradle file, as shown below:

apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.android.application'

android {
  compileSdkVersion 24
  buildToolsVersion "23.0.3"

defaultConfig {
  applicationId "com.peprally.jeremy.peprally"
  minSdkVersion 16
  targetSdkVersion 24
  versionCode 1
  versionName "1.0"
  vectorDrawables.useSupportLibrary = true
}
buildTypes {
  release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  }
  debug {
    debuggable true
  }
}

repositories {
  mavenCentral()
}

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  compile 'com.android.support:appcompat-v7:24.1.1'
  compile 'com.android.support:design:24.1.1'
  compile 'com.android.support:cardview-v7:24.1.1'
  compile 'com.android.support:support-v4:24.1.1'
  compile 'com.android.support:support-vector-drawable:24.1.1'
  compile 'com.facebook.android:facebook-android-sdk:4.6.0'
  compile 'com.google.android.gms:play-services-appindexing:9.2.1'
  compile 'com.google.firebase:firebase-core:9.2.1'
  compile 'com.google.firebase:firebase-messaging:9.2.1'
  compile 'com.amazonaws:aws-android-sdk-core:2.+'
  compile 'com.amazonaws:aws-android-sdk-cognito:2.+'
  compile 'com.amazonaws:aws-android-sdk-s3:2.+'
  compile 'com.amazonaws:aws-android-sdk-ddb:2.+'
  compile 'com.amazonaws:aws-android-sdk-ddb-mapper:2.+'
  compile 'com.squareup.picasso:picasso:2.5.2'
  compile 'com.android.volley:volley:1.0.0'
  compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha1'
  testCompile 'junit:junit:4.12'
}

apply plugin: 'com.google.gms.google-services'

I've seen similar problems being posted on StackOverflow but no good solutions yet. If anyone has any insights, please help! Thanks!

<--EDIT-->

After ignoring the issue and coming back to it, I found a solid solution to get around the VectorDrawable not supported issue. On top of what was suggested, you can create VectorDrawables using the code below:

public static Drawable getAPICompatVectorDrawable(Context callingContext, int resource_id) {
  if (android.os.Build.VERSION.SDK_INT >= 21) {
    return ContextCompat.getDrawable(callingContext.getApplicationContext(), resource_id);
  } else {
    return VectorDrawableCompat.create(
        callingContext.getResources(),
        resource_id,
        callingContext.getTheme());
  }
}

I also had issues trying to put vector drawables directly into xml files. And I couldn't find a way to get around that so I eventually just took them out of my xml files and injected them programmatically in java using the same function as above. The error I got from using vector drawables inside my xml is shown below, if anyone has a better solution, I would love to hear it!

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.
  peprally.jeremy.peprally/com.peprally.jeremy.peprally.activities.
  NewCommentActivity}:
android.view.InflateException: Binary XML file line #90: Error inflating class TextView
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
    at android.app.ActivityThread.access$600(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5103)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #90:
  Error inflating class TextView
like image 736
jerbotron Avatar asked Jul 30 '16 17:07

jerbotron


People also ask

What is a drawable resource in Android?

A drawable resource is a general concept for a graphic that can be drawn to the screen and which you can retrieve with APIs such as getDrawable (int) or apply to another XML resource with attributes such as android:drawable and android:icon . There are several different types of drawables: A bitmap graphic file ( .png, .jpg, or .gif ).

Why am I getting resourcenotfoundexception when referring to a resource?

Good luck folder fiends! This could also happen if the resource you are referring to (lets call it ResA) is in-turn referring to a resource which is missing (lets call it ResB). Android will raise the ResourceNotFoundException for ResA even though whats really missing is ResB.

What is drawable shape in Android?

Shape drawable. A drawable resource is a general concept for a graphic that can be drawn to the screen and which you can retrieve with APIs such as getDrawable (int) or apply to another XML resource with attributes such as android:drawable and android:icon . There are several different types of drawables:

How do I get the resource id of a drawable?

Resource ID. A unique resource ID for this drawable. To create a new resource ID for this item, use the form: "@+id/ name ". The plus symbol indicates that this should be created as a new ID. You can use this identifier to retrieve and modify the drawable with View.findViewById() or Activity.findViewById().


1 Answers

Could you please test the code below? Just to see if works... Then, I'll update the answer with more information

public class MainActivity extends AppCompatActivity {
    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    @Override
    protected void onCreate(Bundle arg0) {
        ...
    }
    ...
}

Background

I was aware that due to this Google Issue - 205236, support to vector Drawable was disabled due to Memory Issues.

One of the comments in that issue is that:

To fix this issue, support for VectorDrawable from resource XML had to be removed.

And then,

In the next release I've added an opt-in API where you can re-enable the VectorDrawable support which was removed.

So, they re-enabled that option 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).

like image 157
W0rmH0le Avatar answered Oct 17 '22 20:10

W0rmH0le