我正在尝试在Android应用程序中使用VectorDrawables。
我想从文件系统中加载一个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>

最佳答案

抱歉不行。除非您以某种方式以编译资源的方式编译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),因为inflate调用尝试将属性集转换为XmlBlock.Parser,从而抛出ClassCastException。原因记录在source中;它将“仅适用于已编译的XML文件”,例如aapt工具打包的资源。

关于android - 是否可以从文件系统(* .xml文件)创建VectorDrawable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32588418/

10-10 18:31
查看更多