ImageView中的XML字符串



我有一个带有xml可绘制代码的String。我需要在类似ImageView的图像中使用此字符串。我需要在活动中使用kotlin/java代码创建许多这样的图像。

我尝试将数据写入xml文件,然后将文件转换为Drawable

/**
* Write text to file 
*/
fun stringToDom(xmlSource : String, filePath: String) {
val fw = FileWriter(filePath)
fw.write(xmlSource)
fw.close()
}
//...
val uri : Uri = Uri.parse("android.resource://com.example.package/" + R.drawable.temp)
stringToDom(i, uri.toString())
val d : Drawable = Drawable.createFromXml(context.resources, context.resources.getXml(R.drawable.temp))
//...

并使用XmlPullParser 解析xml字符串

val parser : XmlPullParser = Xml.newPullParser();
parser.setInput(StringReader(myXmlString));
val d : Drawable = Drawable.createFromXml(resources, parser)

但所有这些都不起作用。

Android框架使用二进制(编译的(XML文件进行绘图。如果您试图直接使用可绘制的XML源代码,则需要做一些工作。首先,您必须将源XML编译为二进制格式。尼古拉斯的回答解释了如何做到这一点。不过,这似乎不是一个完整的答案,因为它看起来只是编译了";路径";声明,但这只是一个开始。这种类型的编译是AAPT工具通过常规工具链为您所做的。除了AAPT,我不知道还有哪个库会进行编译,但可能存在一个。我还没有试过尼古拉斯的代码,但看起来不错。

编译完成后,这个同样来自Nicolas的答案解释了如何将您创建的二进制XML转换为Android可以使用的格式。

如果您的源仅引用Android资源(资源id=0x01xxxxxx(,那么您将能够在应用程序中匹配它们,因为Android资源id在各个版本中都是稳定的。如果您的源引用了应用程序资源(资源id=0x7fxxxxxx(,那么如果应用程序中不存在资源id或资源id不同,您将遇到问题。

(如果这听起来有点过分,您应该考虑CommonsWare建议的SVG转换库。(

如果你能影响网络上的内容,你可以在应用程序中以二进制格式预编译可绘制文件,提取编译后的XML并通过网络发送。这将为您省去第一步,因为AAPT将为您进行编译,而只剩下第二步。您仍然需要确保没有资源不匹配。

最新更新