9

Ich erhalte eine Resources $ notfundexception auf älteren (pre-L) Geräten. Ich schließe den vollständigen StackTrace ein.

Meine Version der Support-Bibliothek ist die neueste (24.1.0), und ich habe in meiner gradle Datei die Zeile enthält:

vectorDrawables.useSupportLibrary = true 

Mein Basis Thema ist ein noactionbar Thema - „Theme.AppCompat .Light.NoActionBar“

Der Absturz auf dieser Linie in meinem Code geschieht, wo ich den zurück-Pfeil in einem Träger-Symbolleiste, um verweisen später, es zu ändern ihre Farbe:

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

Was könnte b e die Ursache dafür? 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) 

Antwort

22

Die Antwort auf diese entpuppte

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

Es stellt sich heraus, dass alles, was Sie brauchen zu Beginn der Tätigkeit dieser Zeile hinzufügen in die Ressource verwenden wird: am Ende dieser Anleitung begraben

static { 
     AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
    } 
+3

ist Ich kann es nicht arbeiten lassen. Hinzugefügt die Zeile, die Sie erwähnten, aber die Anwendung stürzt trotzdem ab. Der Stacktrace ist der gleiche wie in Ihrer Frage. –

+0

haben Sie auch die useSupportLibrary-Zeile zur Gradle-Datei hinzugefügt und verwenden Sie die neueste Version der Support-Bibliothek? – Jon

+1

Ja. Ich vermute, dass das Problem darin liegt, dass Ihre Lösung nur für Aktivitäten funktioniert und AppCompatActivity erweitert, aber meine ist PreferenceActivity. –

0

private Ressourcen seines anders bei der Kompilierung behandelt und runtime..to behebt ich die beanstandete private Ressource in die Regel nehmen und zurückzuportieren es Dateien auf meine app in meinem res

+0

Danke. Ich habe versucht, die Ressource zu nehmen und sie in meinem Drawables-Ordner zu erstellen. Es beschwert sich, dass die Ressource nicht gefunden wird, also habe ich den Namen geändert, um sicherzustellen, dass er nicht versucht, auf die Version der Support-Bibliothek zu verweisen - und beschwert sich immer noch, dass die Ressource nicht gefunden wurde. – Jon

+0

Wenn Sie es portieren, müssen Sie den Namespace ändern, auf den Sie sich beziehen, da es nicht mehr der android-Bereich –

2

Stellen Sie sicher, dass Sie AppCompatActivity anstelle von Activity verwenden. Wenn Sie das Thema von AppCompat verwenden, müssen Sie auch dessen Aktivität verwenden.

0

Ich war mit dem Anwendungskontext, wenn ContextCompat.getDrawable() Aufruf, der auch die App mit Resources$NotFoundException stürzt und jetzt die folgende Meldung, obwohl alles andere ganz gut eingerichtet wurde:

Wenn die Ressource, die Sie verwenden möchten, ist eine Vektorressource, können Sie Referenzierung auf eine nicht unterstützte Weise sein. Weitere Informationen finden Sie unter AppCompatDelegate.setCompatVectorFromResourcesEnabled().

Alles, was ich tun musste, war Context die Ansicht des zu ändern. :)

0

Eine andere Lösung,
neben AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
ist Ihr Vektor ziehbar in eine andere ziehbar zu wickeln:

<?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 sich als ziehbar für eine Textview verwenden (dh DrawableLeft)

0

Akzeptierte Antwort ist nicht in allen Fällen abgedeckt. Es funktioniert nicht auf Android 4.0.3/4.1.1/4.1.2-Plattform mit 25.x.x-Support-Bibliothek. Der richtige Weg, um das Problem mit abc_ic_ab_back_material.xml zu lösen, ist das Attribut homeAsUpIndicator in Ihrem Thema zu überschreiben. Zum Beispiel wird mein Thema von Theme.AppCompat.Light.NoActionBar geerbt. Wie für den Wert des erwähnten Attributs können Sie @drawable/abc_ic_ab_back_mtrl_am_alpha oder Ihr benutzerdefiniertes 'Zurück' Zeichen verwenden.