古い(Lより前の)デバイスでResources $ notfoundexceptionが発生します。以下に完全なスタックトレースを含めます。
私のバージョンのサポートライブラリは最新(24.1.0)であり、gradleファイルに次の行を含めました。
vectorDrawables.useSupportLibrary = true
私の基本テーマはnoactionbarテーマです-「Theme.AppCompat.Light.NoActionBar」
クラッシュは、後で色を変更するためにサポートツールバーの戻る矢印を参照するコードのこの行で発生しています。
@SuppressLint("PrivateResource") final Drawable upArrow = ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_material);
これの原因は何でしょうか?このコードは、L以上のすべてのユーザーに対して正常に機能します。
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)
これに対する答えは、このガイドの下部に埋もれていることが判明しました。
https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88#.xucjbsts
リソースを使用するアクティビティの開始時にこの行を追加する必要があるのは、次のとおりです。
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
アクティビティの代わりにAppCompatActivityを使用していることを確認してください。 AppCompatのテーマを使用している場合は、そのアクティビティも使用する必要があります。
受け入れられた回答がすべての場合を網羅しているわけではありません。 Android 4.0.3/4.1.1/4.1.2プラットフォームと25.xxサポートライブラリでは機能しません。abc_ic_ab_back_material.xml
の問題を修正する正しい方法は次のとおりです。テーマのhomeAsUpIndicator
属性をオーバーライドします。たとえば、私のテーマはTheme.AppCompat.Light.NoActionBar
から継承されます。言及された属性の値については、@drawable/abc_ic_ab_back_mtrl_am_alpha
またはカスタムの「戻る」ドローアブルを使用できます。
別の解決策、AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
に加えて
は、ベクタードローアブルを別のドローアブルにラップすることです。
<?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>
TextViewのドローアブル(つまり、DrawableLeft)として使用する場合に役立つ可能性があります
の代わりに:
ContextCompat.getdrawable()
使用してみてください:
AppCompatDrawableManager.get().getDrawable()
ContextCompat.getDrawable()
を呼び出すときにアプリケーションコンテキストを使用していましたが、これもResources$NotFoundException
でアプリをクラッシュさせ、他のすべてが正常に設定されていても、次のメッセージが表示されます。
使用しようとしているリソースがベクターリソースである場合、サポートされていない方法でそれを参照している可能性があります。詳細については、AppCompatDelegate.setCompatVectorFromResourcesEnabled()を参照してください。
私がしなければならなかったのは、ビューのContext
に変更することだけでした。 :)
プライベートリソースは、コンパイル時と実行時に異なる方法で処理されます。修正するには、通常、問題のあるプライベートリソースを取得し、resファイルでアプリにバックポートします。