web-dev-qa-db-ja.com

AppCompat 23.3サポートベクターは機能しなくなりましたか?

Support Library 23.2 にAppCompatと共に追加されたサポートベクタードロウアブルを使用していました。私は両方ともapp:srcCompatおよびStateListDrawable内で、Android:drawableLeft私のTextView。

AppCompatの23.3.0バージョンにアップグレードして以来、app:srcCompat 作業しています。私が得る他の方法でそれを参照するたびに

FATAL EXCEPTION: main
 Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.package.name/.MainActivity}: Android.view.InflateException: Binary XML file line #8: Error inflating class Button
 ...
 Caused by: Android.view.InflateException: Binary XML file line #8: Error inflating class Button
 ...
 Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #14: invalid drawable tag vector
  at Android.graphics.d

現在、サポートベクタードロウアブルが失敗する原因となった変更は何ですか?

32
ianhanniballake

Update:サポートライブラリ23で再度有効にします:

AppCompatユーザー向けに、オプトインAPIを追加して、AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)を介してリソースからのベクターDrawables(23.2で見つかった動作)のサポートを再度有効にしました。 -これにより、メモリ使用量の問題や構成インスタンスの更新の問題が発生する可能性があるため、デフォルトで無効になっている理由に留意してください。

チェック このリンク:23.4.0が利用可能になりました
--------------------------------------------- --------------

Android Support Library 23.3のリリース発表

AppCompatユーザーの場合、バージョン23.2.0/23.2.1の実装で見つかった問題のために、Lollipop以前のデバイスのリソースからベクトルドロウアブルを使用できる機能を削除することにしました[ https:// code.google.com/p/Android/issues/detail?id=205236https://code.google.com/p/Android/issues/detail?id=204708 ] 。 _app:srcCompat_およびsetImageResource()の使用は引き続き機能します。

したがって、これは予想される動作の変更です。 srcCompatで処理されない場合は、ベクター以外のグラフィックを使用する必要があります。

API 21より前のベクターを引き続き使用したい場合は、行を削除できます

_vectorDrawables.useSupportLibrary = true
_

(または 23.2ブログ投稿 に示されている1.5 Gradleプラグインを使用している場合は、同等のもの)。

これにより、Android St​​udioは、API 21未満のデバイスでベクターを使用しているときにAPI 21未満のminSdkVersionを持つアプリのコンパイル時にPNGを生成し、_23.2.1_と同じコードを保持できます。追加のAPKサイズを犠牲にして。

41
ianhanniballake

ロリポップ以前のVectorDrawableサポートはサポートライブラリ23.2.0に追加され、23.3.0で部分的に削除されました。 23.4.0以降(少なくとも25.1.0)では、削除された部分は元に戻りますが、オプションのフラグが付いています(価格が付いているため)。

要約すると、サポートライブラリ23.4.0から少なくとも25.1.0で、VectorDrawableを動作させることができます場合によっては

この図 を助けました。

VectorDrawable cheatsheet

17
David Ferrand

を使用せずにベクターをcompoundDrawables(例:textview)として使用するには

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

これは、文書化された高いメモリ使用量につながり、単にベクトルを使用して膨張させます

Drawable drawable = AppCompatResources.getDrawable( getContext(), R.drawable.vector_resID );
if( drawable != null ) drawable.setBounds( 0, 0, iconSize, iconSize );
TextViewCompat.setCompoundDrawablesRelative( textView, null, null, drawable, null);

これがnavDrawerの仕組みです

4
nGL