13

Android アプリで VectorDrawables を使用しようとしています。
ファイル システムから xml ファイルをロードし、 のインスタンスを取得して .xml ファイルandroid.graphics.Drawableに表示したいと考えていますImageView。xml ファイルを Resources ディレクトリに追加すると、機能します。しかし、ファイルシステムからロードしようとすると、常に NullPointer が発生します。

Drawable.createFromPath(*Path to File*)現在、またはを介し​​てファイルを読み込もうとしています VectorDrawable.createFromPath(*Path to File*)が、NullPointer が引き続き発生します。ファイルが存在し、有効な xml ファイルです (以下を参照)。

adb ログでは、常に次のようになります。

SkImageDecoder::Factory returned null

パスを使用する mContext.getFilesDir()と、次のようになります

/data/data/*packagename*/files/*filename*.xml

「ダウンロード」などのパブリックフォルダーも試しました。File.io Apiでファイルをチェックするとexists()canRead()canWrite()

更新これは、Android Dev Pages から取得した XML コードです

 <vector xmlns:android="http://schemas.android.com/apk/res/android"
 android:height="64dp"
 android:width="64dp"
 android:viewportHeight="600"
 android:viewportWidth="600" >
 <group
     android:name="rotationGroup"
     android:pivotX="300.0"
     android:pivotY="300.0"
     android:rotation="45.0" >
     <path
         android:name="v"
         android:fillColor="#000000"
         android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
 </group>

4

3 に答える 3

7

残念だけど違う。リソースがコンパイルされる方法で何らかの方法で XML ソース ファイルをコンパイルしない限り、そうではありません。 VectorDrawable現在、コンパイル済みの画像ソースを想定しています。

そうでなければ、おそらく次のように書くことができたでしょう:

VectorDrawable d = new VectorDrawable();
try( InputStream in = new FileInputStream( *Path to File* ); )
{
    XmlPullParser p = Xml.newPullParser();
    p.setInput( in, /*encoding, self detect*/null );
    d.inflate( getResources(), p, Xml.asAttributeSet(p) ); // FAILS
}

現在のところ、これは失敗します (API レベル 23、Marshmallow 6.0)。これは、inflate 呼び出しが属性セットを にキャストしようとしてXmlBlock.Parser、 がスローされるためClassCastExceptionです。原因はソースに記載されています。aaptツールによってパッケージ化されたリソースなど、「コンパイルされた XML ファイルでのみ機能します」 。

于 2016-02-17T18:21:50.687 に答える