我正在尝试在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/