Drawable.createFromStream()返回null

时间:2017-04-02 15:41:09

标签: android xml android-vectordrawable

在我的Android Studio项目中,我创建了一个名为assets的自定义文件夹,该文件夹又包含另一个名为flags的文件夹,后者又包含许多代表SVG图像的XML文件。 每当我尝试加载此类XML文件并通过函数Drawable从中创建Drawable.createFromStream()时,我都会获得null

以下是代码:

AssetManager am = getApplicationContext().getAssets();
String[] files = new String[0];
try
{
  files = am.list("flags");
}
catch (IOException e)
{
  e.printStackTrace();
}
// At this point, variable 'files' correctly contains all the names of my XML files
ArrayList<Drawable> drawables = new ArrayList<>();
for (String file : files)
{
  Drawable d = null;
  try
  {
    d = Drawable.createFromStream(am.open("flags/" + file), null);
  }
  catch (IOException e)
  {
    Log.i("EX2", "Second exception: " + file + " not found");
    e.printStackTrace();
  }
  drawables.add(d);
  if (d == null) // This message is always printed, but no exception occurs
    Log.i("FLAG", "Null drawable");
}

从上面的代码中可以看出,即使找到XML文件,也始终会打印消息Null drawable(事实上,不会发生异常)。

1 个答案:

答案 0 :(得分:0)

  

反过来包含许多代表SVG图像的XML文件

Android无法将SVG文件用作drawable,无论是资产还是其他任何东西。请尝试使用a third-party SVG library代替Drawable.createFromStream()

在您的情况下,您没有SVG文件,而是从这些SVG文件创建的矢量绘图。显然,Drawable.createFromStream()不支持这些。或者,也许您正在测试旧设备; Drawable.createFromStream()肯定不支持Android 4.4和旧设备上的矢量绘图。在您的情况下,只需将矢量d​​rawable存储为drawable,而不是资产。