2015-09-15 149 views
5

我想在我的Android應用程序中使用VectorDrawables。
我想從文件系統中加載一個xml文件並獲得一個android.graphics.Drawable的實例,以便在ImageView中顯示它。如果我將XML文件添加到資源目錄,它的工作原理。但是當我嘗試從文件系統中加載它時,我總是得到一個NullPointer。是否有可能從文件系統創建VectorDrawable(* .xml文件)

我目前正試圖通過 Drawable.createFromPath(*Path to File*)VectorDrawable.createFromPath(*Path to File*)加載文件,但我不斷得到一個NullPointer。 該文件存在並且是有效的xml文件(請參閱下文)。

亞行日誌我總是得到:

SkImageDecoder::Factory returned null 

當我使用mContext.getFilesDir()路徑看起來像

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

我也嘗試了一些公共文件夾,如「下載」。當我與File.io API檢查文件它exists()canRead()canWrite()

更新此北京時間來自Android開發人員網頁

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

目前失敗(API等級23,棉花糖6.0),因爲充氣呼叫嘗試施放屬性設置爲XmlBlock.Parser,它拋出一個ClassCastException。原因記錄在source;它將「僅適用於已編譯的XML文件」,例如由aapt工具打包的資源。

+1

爲此添加了一個請求:https://issuetracker.google。com/issues/62435069 –

0

其實,你可以,而且我已經在自己的項目中完成了。

正如前面的回答中提到的那樣,您確實需要XML drawable的編譯版本,而不是您從Android Studio獲得的版本。 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中看到的那樣? –

相關問題