web-dev-qa-db-de.com

Android: Ressourcen $ NotFoundException für abc_ic_ab_back_material abrufen

Bei älteren Geräten (vor L-Geräten) erhalte ich eine Ressourcen-$ -Notfall-Ausnahme. Ich füge unten den vollständigen Stacktrace hinzu. 

Meine Version der Support-Bibliothek ist die neueste (24.1.0) und ich habe die Zeile in meine Gradle-Datei eingefügt:

vectorDrawables.useSupportLibrary = true

Mein Basisthema ist ein noactionbar-Theme - "Theme.AppCompat.Light.NoActionBar"

Der Absturz geschieht in dieser Zeile in meinem Code, wo ich auf den hinteren Pfeil in einer Support-Symbolleiste verweise, um später dessen Farbe zu ändern:

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

Was könnte die Ursache sein? Dieser Code funktioniert für alle Benutzer mit L oder höher. 

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

Die Antwort darauf erwies sich am Ende dieses Leitfadens:

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

Es stellt sich heraus, dass Sie alles, was Sie brauchen, um diese Zeile am Anfang der Aktivität hinzuzufügen, die die Ressource verwenden wird:

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

Stellen Sie sicher, dass Sie AppCompatActivity statt Activity verwenden. Wenn Sie das AppCompat-Design verwenden, müssen Sie auch dessen Aktivität verwenden.

2
umi

Die akzeptierte Antwort gilt nicht für alle Fälle. Es funktioniert nicht auf Android 4.0.3/4.1.1/4.1.2-Plattform mit 25.x.x Support Library . Der richtige Weg, das Problem mit abc_ic_ab_back_material.xml zu beheben, besteht darin, das homeAsUpIndicator-Attribut in Ihrem Design zu überschreiben. Zum Beispiel wird mein Design von Theme.AppCompat.Light.NoActionBar vererbt. Als Wert für das angegebene Attribut können Sie @drawable/abc_ic_ab_back_mtrl_am_alpha oder Ihr benutzerdefiniertes "back" drawable verwenden. 

1
Samik

Eine andere Lösung,
zusätzlich zu AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
soll Ihren Vektor in ein anderes Zeichen zeichnen: 

<?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>

Könnte nützlich sein, wenn Sie als Zeichenelement für eine Textansicht verwenden (z. B. DrawableLeft).

1
Leo Droidcoder

Anstatt von:

ContextCompat.getdrawable()

Versuchen Sie es mit:

AppCompatDrawableManager.get().getDrawable() 
0

Ich habe den Anwendungskontext beim Aufruf von ContextCompat.getDrawable() verwendet, was die App ebenfalls mit Resources$NotFoundException und nun der folgenden Meldung abstürzt, obwohl alles andere einwandfrei eingerichtet wurde:

Wenn die Ressource, die Sie verwenden möchten, eine Vektorressource ist, verweisen Sie Möglicherweise auf eine nicht unterstützte Art und Weise. Siehe AppCompatDelegate.setCompatVectorFromResourcesEnabled () für weitere Informationen.

Alles, was ich tun musste, war zur Context der Ansicht zu wechseln. :)

0
Roy Solberg

private Ressourcen werden zur Kompilierzeit und zur Laufzeit unterschiedlich behandelt. Um das Problem zu beheben, nehme ich normalerweise die beleidigende private Ressource und portiere sie zurück zu meiner App in meinen res-Dateien

0
Fred Grott