1. ホーム
  2. android

[解決済み] Lollipop以前のクラッシュでandroidのベクターDrawableを使用する

2023-01-23 03:12:13

質問

アンドロイドでベクターデータを使用しています。 ロリポップ以前の を使用しており、これらは私のライブラリとツールのバージョンの一部です。

  • Android Studio : 2.0
  • Android Gradle プラグイン : 2.0.0
  • ビルド ツール : 23.0.2
  • Android サポート ライブラリ : 23.3.0

アプリレベルでこのプロパティを追加しました Build.Gradle

android {  
  defaultConfig {  
    vectorDrawables.useSupportLibrary = true  
   }  
}

また、Android公式ブログにあるように、LayerDrawable(layer_list)などの追加のdrawableを使用していることも特筆すべき点です( リンクはこちら ) の外側のベクタードローアブルにドローアブルを設定します。 app:srcCompat

<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/search"/>
</level-list>

の外側でベクター描画可能ファイルを直接参照すると、ロリポップ以前は失敗することがわかります。 app:srcCompat の外側で vector drawables を直接参照すると、Lollipop よりも前に失敗することがわかります。しかし、AppCompat は のような別の描画可能なコンテナで参照されている場合、ベクター描画可能ファイルの読み込みをサポートします。 しかし、AppCompat は、StateListDrawable や InsetDrawable などの他の drawable コンテナで参照されている場合の vector drawable の読み込みをサポートしています。 LayerDrawable, LevelListDrawable, RotateDrawable などの他の描画可能なコンテナで参照されている場合の読み込みをサポートしています。これを使うことで インダイレクト を使うことで、TextView の android:drawableLeft 属性のような、通常はベクトル描画をサポートしないようなケースでも使用できるようになります。 のような場合にベクター描画可能を使うことができます。

私が app:srcCompat を使用しているときは、すべてうまくいきますが

android:background
android:drawableLeft
android:drawableRight
android:drawableTop
android:drawableBottom

ImageView , ImageButton , TextView または EditText を使用すると、エクスペクトが発生します。

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9

どのように解決するのですか?

最新の更新情報 - 2019年6月

サポートライブラリは、最初の回答から少し変わりました。今では、GradleのAndroidプラグインでさえ、ビルド時にPNGを自動的に生成することができます。そこで、以下は、最近動作するはずの 2 つの新しいアプローチです。より詳細な情報は を参照してください。

PNG の生成

Gradleはビルド時にアセットから自動的にPNG画像を作成することができます。しかし、この手法では すべてのxml要素がサポートされているわけではありません . この方法は、コードやbuild.gradleを変更する必要がないため便利です。ただ、あなたが Android Plugin 1.5.0以降を使用していること。 Android Studio 2.2以降 .

私は自分のアプリでこのソリューションを使用しており、問題なく動作しています。追加の build.gradle フラグは必要ありません。ハックも必要ありません。もし、あなたが /build/generated/res/pngs/... にアクセスすると、生成されたすべてのPNGを見ることができます。

というわけで、もし簡単なアイコンがあれば(すべてのxml要素がサポートされているわけではないので)、この解決策はあなたのために働くかもしれません。Android Studio と Gradle 用の Android プラグインを更新するだけです。

サポートライブラリ

おそらく、これがあなたのために動作するソリューションです。ここに来たということは、Android Studio が PNG を自動的に生成していないことを意味します。だから、あなたのアプリはクラッシュしています。

または、Android Studio が PNG をまったく生成しないことを望んでいないのかもしれません。

XML要素のサブセットをサポートする自動PNG生成とは異なり、このソリューションでは、すべてのXMLタグをサポートします。そのため、ベクター描画を完全にサポートすることができます。

まず build.gradle を更新してください。

android {
  defaultConfig {
    // This flag will also prevents Android Studio from generating PNGs automatically
    vectorDrawables.useSupportLibrary = true
  }
}

dependencies {
  // Use this for Support Library
  implementation 'com.android.support:appcompat-v7:23.2.0' // OR HIGHER

  // Use this for AndroidX
  implementation 'androidx.appcompat:appcompat:1.1.0' // OR HIGHER
}

そして app:srcCompat の代わりに android:src を読み込んでいる間に VectorDrawables . これを忘れてはいけません。

については TextView を使用している場合は androidx バージョンのサポートライブラリの場合は app:drawableLeftCompat (または right, top, bottom) の代わりに app:drawableLeft

の場合 CheckBox / RadioButton を使用します。 app:buttonCompat の代わりに android:button .

を使用しない場合は androidx バージョンのサポートライブラリと minSdkVersion17 またはそれ以上である場合、またはボタンを使用する場合、プログラム的に

Drawable icon = AppCompatResources.getDrawable(context, <drawable_id>);
textView.setCompoundDrawablesWithIntrinsicBounds(<leftIcon>,<topIcon>,<rightIcon>,<bottomIcon>);


更新日 - 2016年7月

でそのVectorDrawableを再有効化したそうです。

アンドロイドサポートライブラリ 23.4.0

AppCompatをご利用の方へ を追加しました。 オプトイン AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) により、リソースからの Vector Drawables サポート (23.2 で見つかった動作) を再度有効にする API が追加されました - これはまだメモリ使用と Configuration インスタンスの更新に問題があることを念頭に、それゆえデフォルトで無効になっています。

もしかしたら , build.gradle の設定は廃止され、適切なアクティビティで有効にする必要があります (ただし、テストが必要です)。

さて、これを有効にするには、次のようにします。

public class MainActivity extends AppCompatActivity {
    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    ...
}


元の回答 - 2016年4月

最新ライブラリバージョン:23.3.0でサポートベクターが無効化されたため、この現象が起きていると思います。

これによると POST :

AppCompat ユーザー向けに、ロリポップ以前のデバイスでリソースからベクター形式の描画データを使用できる機能を削除することに決定しました。 (ISSUE 205236) . app:srcCompat と setImageResource() を使用すると、引き続き機能します。

もしあなたがissue ISSUE 205236 を見ると、将来的には有効になるようですが、メモリの問題はすぐには修正されないようです。

次のリリースでは、削除された VectorDrawable サポートを再び有効にすることができるオプトイン API を追加しました。しかし、これには以前と同じ注意事項 (メモリ使用量と設定更新の問題) があります。

私も同じような問題がありました。私の場合、リソースからベクター描画可能なアイコンをすべてPNG画像に戻しました(メモリの問題は、それを再び有効にするオプションを提供した後も起こり続けるため)。

これが最良の選択肢であるかどうかはわかりませんが、私の意見では、これですべてのクラッシュが修正されました。