web-dev-qa-db-ja.com

Android:abc_ic_ab_back_materialのResources $ NotFoundExceptionを取得

古い(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)
9
Jon

これに対する答えは、このガイドの下部に埋もれていることが判明しました。

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

リソースを使用するアクティビティの開始時にこの行を追加する必要があるのは、次のとおりです。

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

アクティビティの代わりにAppCompatActivityを使用していることを確認してください。 AppCompatのテーマを使用している場合は、そのアクティビティも使用する必要があります。

2
umi

受け入れられた回答がすべての場合を網羅しているわけではありません。 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またはカスタムの「戻る」ドローアブルを使用できます。

1
Samik

別の解決策、
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)として使用する場合に役立つ可能性があります

1
Leo Droidcoder

の代わりに:

ContextCompat.getdrawable()

使用してみてください:

AppCompatDrawableManager.get().getDrawable() 
0

ContextCompat.getDrawable()を呼び出すときにアプリケーションコンテキストを使用していましたが、これもResources$NotFoundExceptionでアプリをクラッシュさせ、他のすべてが正常に設定されていても、次のメッセージが表示されます。

使用しようとしているリソースがベクターリソースである場合、サポートされていない方法でそれを参照している可能性があります。詳細については、AppCompatDelegate.setCompatVectorFromResourcesEnabled()を参照してください。

私がしなければならなかったのは、ビューのContextに変更することだけでした。 :)

0
Roy Solberg

プライベートリソースは、コンパイル時と実行時に異なる方法で処理されます。修正するには、通常、問題のあるプライベートリソースを取得し、resファイルでアプリにバックポートします。

0
Fred Grott