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)
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);
}
Assurez-vous d'utiliser AppCompatActivity à la place de Activity. Si vous utilisez le thème d'AppCompat, vous devez également utiliser son activité.
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.
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)
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. :)
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