2015-09-15 20 views
5

私はAndroidアプリケーションでVectorDrawablesを使用しようとしています。
ファイルシステムからxmlファイルをロードし、インスタンスandroid.graphics.Drawableを取得してImageViewに表示したいとします。リソースディレクトリにxmlファイルを追加すると動作します。しかし、ファイルシステムからロードしようとすると、常にNullPointerが得られます。ファイルシステム(* .xmlファイル)からVectorDrawableを作成することは可能ですか?

現在、ファイルを Drawable.createFromPath(*Path to File*)またはVectorDrawable.createFromPath(*Path to File*)でロードしようとしていますが、引き続きNullPointerを取得しています。 ファイルが存在し、有効なxmlファイルです(下記参照)。

私は常に取得ADBログに:私はmContext.getFilesDir()を使用する場合

SkImageDecoder::Factory returned null 

パスは、私はまた、 "ダウンロード" のようないくつかのパブリックフォルダを試してみました

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

ようになります。私はFile.io APIを使用してファイルをチェックし、それexists()canRead()canWrite()

更新これはなし、アンドロイドのDevページ残念なことに

<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> 

+0

xmlファイルのコードを投稿できますか? – Kmeixner

答えて

3

から取られたXMLコードをイスト。リソースがコンパイルされる方法で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 
} 

現在のinflateコール試みはAスローXmlBlock.Parserに設定された属性を、キャストするので(APIレベル23、マシュマロ6.0を)失敗ClassCastException。原因はsourceに記載されています。 aaptツールでパッケージ化されたリソースなど、「コンパイルされたXMLファイルでのみ動作します」。

+1

これにリクエストを追加しました:https://issuetracker.google。com/issues/62435069 –

0

実際、はいできますし、自分のプロジェクトでやりました。

しかし、前の答えで述べたように、実際には、AndroidスタジオなどのXMLドロワブルの代わりにコンパイルされたXMLドロワブルが必要です。 AFAIKでは、VectorDrawable APIは生のXMLからの読み込みをまだサポートしていません。

これを行うには、画像を一時的にresディレクトリの下に置き、ビルドプロセス中に通常のリソースとしてコンパイルし、生成されたAPKを見つけてそこから抽出しますテキストファイルですがバイナリファイルです)。今、あなたはあなたの資産のディレクトリの下に好きな場所、再びそれらを置くとドロウアブルとしてそれらをロードするために、このようなコードを使用します。

XmlResourceParser parser = context.getAssets() 
    .openXmlResourceParser("assets/folder/image.xml"); 
drawable = VectorDrawableCompat.createFromXml(context.getResources(), parser); 

お知らせパスの「資産/」の部分。それは必要です、afaik。

+0

通常のXMLファイルからファイルを読み込む方法はありますか?IDEで見ることができますか? –

関連する問題