[解決済み] Lollipop以前のクラッシュでandroidのベクターDrawableを使用する
質問
アンドロイドでベクターデータを使用しています。 ロリポップ以前の を使用しており、これらは私のライブラリとツールのバージョンの一部です。
- 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
バージョンのサポートライブラリと
minSdkVersion
は
17
またはそれ以上である場合、またはボタンを使用する場合、プログラム的に
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画像に戻しました(メモリの問題は、それを再び有効にするオプションを提供した後も起こり続けるため)。
これが最良の選択肢であるかどうかはわかりませんが、私の意見では、これですべてのクラッシュが修正されました。
関連
-
[解決済み] プログラム的に電話をかけるには?
-
[解決済み] AppCompat-v7 21でアクションバー/ツールバーにアイコンを表示する。
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] FloatingActionButtonのサンプルとサポートライブラリ
-
[解決済み] XMLで矩形を描画できますか?
-
[解決済み] Androidアプリケーションのヒープサイズを大きくするには?
-
[解決済み] 非推奨のandroid.support.v4.app.ActionBarDrawerToggleの置き換え方法
-
[解決済み] アダプタからActivityメソッドを呼び出す
-
[解決済み] ブルートゥースアプリケーションのテストにアンドロイドエミュレータを使用するには?
-
[解決済み] ベクターの描画が期待通りに拡大縮小されないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AndroidにおけるViewPager2の適切な実装
-
[解決済み] プログラムでソフトキーボードを開く
-
[解決済み] AndroidでラジオボタンにOnClickListenerを設定するには?
-
[解決済み] FloatingActionButtonのサンプルとサポートライブラリ
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] 複数のフィルタを持つBroadcastReceiverか、複数のBroadcastReceiverか?
-
[解決済み] Android - Snackbar vs Toast - 使い方と違い。
-
[解決済み] android:DrawableRightを使ってButtonやTextViewでVectorDrawableを使用することは可能でしょうか?
-
[解決済み] 文字列リソースにHTML?
-
[解決済み] <string> XMLで改行やタブを作るには(eclipse/android)?