web-dev-qa-db-fra.com

Android: obtention de ressources $ NotFoundException pour abc_ic_ab_back_material

Je reçois une exception $ nonfound ressources sur des appareils plus anciens (pré-L). J'inclus le stacktrace complet ci-dessous. 

Ma version de la bibliothèque de support est la dernière (24.1.0), et j'ai inclus dans mon fichier gradle la ligne:

vectorDrawables.useSupportLibrary = true

Mon thème de base est un thème noactionbar - "Theme.AppCompat.Light.NoActionBar"

Le crash se produit sur cette ligne de mon code où je fais référence à la flèche de retour dans une barre d’outils de support afin de changer plus tard sa couleur:

@SuppressLint("PrivateResource") final Drawable upArrow = ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_material);

Quelle pourrait en être la cause? Ce code fonctionne bien pour tous les utilisateurs avec L ou plus. 

07-19 22:36:57.029 9330-9330/mypkg E/AndroidRuntime: FATAL EXCEPTION: main
 Java.lang.RuntimeException: Unable to resume activity {mypkg/mypkg.activites.myActivity}: Android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013
     at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:2619)
     at Android.app.ActivityThread.handleResumeActivity(ActivityThread.Java:2647)
     at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2104)
     at Android.app.ActivityThread.access$600(ActivityThread.Java:138)
     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1205)
     at Android.os.Handler.dispatchMessage(Handler.Java:99)
     at Android.os.Looper.loop(Looper.Java:137)
     at Android.app.ActivityThread.main(ActivityThread.Java:4929)
     at Java.lang.reflect.Method.invokeNative(Native Method)
     at Java.lang.reflect.Method.invoke(Method.Java:511)
     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:798)
     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:565)
     at dalvik.system.NativeStart.main(Native Method)
  Caused by: Android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013
     at Android.content.res.Resources.loadDrawable(Resources.Java:1957)
     at Android.content.res.Resources.getDrawable(Resources.Java:673)
     at Android.support.v4.content.ContextCompat.getDrawable(ContextCompat.Java:354)
     at mypkg.base.mymethod(myactivity.Java:100)
     at mypkg.mymethod(myactivity.Java:100)
     at Android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.Java:511)
     at Android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.Java:178)
     at Android.app.Activity.performResume(Activity.Java:5341)
     at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:2599)
     at Android.app.ActivityThread.handleResumeActivity(ActivityThread.Java:2647) 
     at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2104) 
     at Android.app.ActivityThread.access$600(ActivityThread.Java:138) 
     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1205) 
     at Android.os.Handler.dispatchMessage(Handler.Java:99) 
     at Android.os.Looper.loop(Looper.Java:137) 
     at Android.app.ActivityThread.main(ActivityThread.Java:4929) 
     at Java.lang.reflect.Method.invokeNative(Native Method) 
     at Java.lang.reflect.Method.invoke(Method.Java:511) 
     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:798) 
     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:565) 
     at dalvik.system.NativeStart.main(Native Method) 
  Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
     at Android.graphics.drawable.Drawable.createFromXmlInner(Drawable.Java:877)
     at Android.graphics.drawable.Drawable.createFromXml(Drawable.Java:818)
     at Android.content.res.Resources.loadDrawable(Resources.Java:1954)
     at Android.content.res.Resources.getDrawable(Resources.Java:673) 
     at Android.support.v4.content.ContextCompat.getDrawable(ContextCompat.Java:354) 
     at mypkg/mymethod(myactivity.Java:100) 
     at mypkg/mymethod(myactivity.Java:100) 
     at Android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.Java:511) 
     at Android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.Java:178) 
     at Android.app.Activity.performResume(Activity.Java:5341) 
     at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:2599) 
     at Android.app.ActivityThread.handleResumeActivity(ActivityThread.Java:2647) 
     at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2104) 
     at Android.app.ActivityThread.access$600(ActivityThread.Java:138) 
     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1205) 
     at Android.os.Handler.dispatchMessage(Handler.Java:99) 
     at Android.os.Looper.loop(Looper.Java:137) 
     at Android.app.ActivityThread.main(ActivityThread.Java:4929) 
     at Java.lang.reflect.Method.invokeNative(Native Method) 
     at Java.lang.reflect.Method.invoke(Method.Java:511) 
     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:798) 
     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:565) 
     at dalvik.system.NativeStart.main(Native Method)
9
Jon

La réponse à cette question s’est avérée être enterrée au bas de ce guide:

https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88#.xucjbsts0

Il s’avère que tout ce dont vous avez besoin pour ajouter cette ligne au début de l’activité qui utilisera la ressource:

static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }
23
Jon

Assurez-vous d'utiliser AppCompatActivity à la place de Activity. Si vous utilisez le thème d'AppCompat, vous devez également utiliser son activité.

2
umi

La réponse acceptée n'est pas couverte dans tous les cas. Cela ne fonctionnera pas sur la plate-forme Android 4.0.3/4.1.1/4.1.2 avec la bibliothèque de support 25.x.x . La bonne façon de résoudre le problème avec abc_ic_ab_back_material.xml consiste à remplacer l'attribut homeAsUpIndicator dans votre thème. Par exemple, mon thème est hérité de Theme.AppCompat.Light.NoActionBar. En ce qui concerne la valeur de l'attribut mentionné, vous pouvez utiliser @drawable/abc_ic_ab_back_mtrl_am_alpha ou votre dessin personnalisable. 

1
Samik

Une autre solution,
en plus de AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
consiste à envelopper votre vecteur dans un autre dessin: 

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

Pourrait être utile lorsque vous utilisez comme dessin pour TextView (par exemple DrawableLeft)

1
Leo Droidcoder

J'utilisais le contexte de l'application lorsque j'ai appelé ContextCompat.getDrawable(), ce qui a également provoqué le blocage de l'application avec Resources$NotFoundException et le message suivant bien que tout le reste ait été configuré correctement:

Si la ressource que vous essayez d'utiliser est une ressource vectorielle, vous pouvez le référencer D'une manière non prise en charge. Voir AppCompatDelegate.setCompatVectorFromResourcesEnabled () pour plus d'informations.

Tout ce que j'avais à faire était de passer à la Context de la vue. :)

0
Roy Solberg

les ressources privées sont traitées différemment au moment de la compilation et de l'exécution..pour réparer, je prends généralement la ressource privée fautive et la transfère à mon application dans mes fichiers res

0
Fred Grott