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)
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);
}
Stellen Sie sicher, dass Sie AppCompatActivity statt Activity verwenden. Wenn Sie das AppCompat-Design verwenden, müssen Sie auch dessen Aktivität verwenden.
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.
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).
Anstatt von:
ContextCompat.getdrawable()
Versuchen Sie es mit:
AppCompatDrawableManager.get().getDrawable()
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. :)
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