【问题标题】:Loading Android Vector Drawable from a location other than res/drawables从 res/drawables 以外的位置加载 Android Vector Drawable
【发布时间】:2016-03-17 14:30:38
【问题描述】:

我正在尝试使用新的 VectorDrawableCompat 来处理已转换为 Android Vector 格式的 SVG。我按照 Android 开发人员博客Android Support Library 23.2 中提到的设置说明进行操作,并且能够以这种方式显示可绘制的矢量。虽然大多数时候,这就是我需要在应用程序中显示大多数图标/图像的方式,但我确实需要从可能经常更改的服务器加载特定的图像列表。这样做的主要原因是我不需要仅仅为了更改/添加图标而向应用程序发布更新。

作为测试,我尝试从 Assets 加载相同的格式(Android Vector Drawable 格式),当 VectorDrawableCompat 尝试为 xml 生成属性集以提取标签中的属性时,我得到一个运行时异常试图将 XmlPullAttributes 转换为 XmlBlockParser:

java.lang.RuntimeException: java.lang.ClassCastException: android.util.XmlPullAttributes cannot be cast to android.content.res.XmlBlock$Parser
                                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2581)
                                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2641)
                                                                                     at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398)
                                                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                     at android.os.Looper.loop(Looper.java:148)
                                                                                     at android.app.ActivityThread.main(ActivityThread.java:5849)
                                                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:763)
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653)
                                                                                  Caused by: java.lang.ClassCastException: android.util.XmlPullAttributes cannot be cast to android.content.res.XmlBlock$Parser
                                                                                     at android.content.res.Resources.obtainAttributes(Resources.java:1896)
                                                                                     at android.support.graphics.drawable.VectorDrawableCommon.obtainAttributes(VectorDrawableCommon.java:43)
                                                                                     at android.support.graphics.drawable.VectorDrawableCompat.inflate(VectorDrawableCompat.java:469)
                                                                                     at android.support.graphics.drawable.VectorDrawableCompat.createFromXmlInner(VectorDrawableCompat.java:436)
                                                                                     at com.mobile.hilton.amentiesicontestr.MainActivity.createFromXmlStream(MainActivity.java:65)
                                                                                     at com.mobile.hilton.amentiesicontestr.MainActivity.onCreate(MainActivity.java:33)
                                                                                     at android.app.Activity.performCreate(Activity.java:6570)
                                                                                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2534)
                                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2641) 
                                                                                     at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398) 
                                                                                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                     at android.os.Looper.loop(Looper.java:148) 
                                                                                     at android.app.ActivityThread.main(ActivityThread.java:5849) 
                                                                                     at java.lang.reflect.Method.invoke(Native Method) 
                                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:763) 
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653) 

我相信它在抱怨,因为它找不到 VectorDrawable XML 引用的 Android 命名空间。通常drawables是预编译的,在这种情况下,我的xml不是。关于如何解决这个问题或使它工作的任何想法?也许我从 Android 文档中遗漏了一些东西,但我找不到从 res/drawables 之外支持 VectorDrawable 的方法。任何帮助将不胜感激,在此先感谢您。

【问题讨论】:

  • VectorDrawableCompat2 来自哪里?我在支持库中找不到它。
  • 感谢您指出这一点,我输入了错误的堆栈跟踪。我刚刚更新了 VectorDrawableCompat 的正确堆栈跟踪
  • 是的,看起来VectorDrawable/VectorDrawableCompat 只与资源一起工作。你也许可以 fork VectorDrawableCompat 并解决这个问题。即兴发挥,对TypedArray(来自obtainAttributes())的需求受限于updateStateFromTypedArray() 方法,从inflate() 调用。也许您可以将obtainAttributes()updateStateFromTypedArray() 替换为可以与普通XmlPullParser 一起使用的代码。
  • 我在这里创建了一个请求:issuetracker.google.com/issues/62435069
  • Resources 类中有一条注释说:“XXX 请注意,现在我们只处理编译的 XML 文件。为了支持通用 XML 文件,我们需要手动解析 XML 中的属性文件(应用资源中包含的类型信息等)。”。所以我相信它不适用于非编译的 XML 资源 =(

标签: android android-vectordrawable


【解决方案1】:

一种解决方案是将矢量 xml 添加到可绘制文件夹中。编译apk。解压apk并从apk中复制编译好的vector xml文件。将此向量 xml 上传到服务器。下载此文件并动态扩展它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    相关资源
    最近更新 更多