【问题标题】:Vector Drawables flag doesn't work on Support Library 24+Vector Drawables 标志在支持库 24+ 上不起作用
【发布时间】:2016-08-23 02:44:39
【问题描述】:

今天,Android Nougat 似乎是released。因此,我比以往任何时候都更兴奋地针对分屏等新功能优化我的应用程序。我想推送一个以 SDK 版本 24 为目标的应用程序版本,以便用户不会收到通知我的应用程序可能无法在分屏中运行。但是,这样做意味着我还应该更新到支持库的版本24。像许多其他人一样,我在更新到支持库的版本 23.2.0 时遇到了问题。但是,我关注了this answer,它解决了我的问题。现在这个问题从24.0.0 和支持库的版本开始返回。在我的所有测试中,我都使用链接答案中描述的 gradle 标志:

vectorDrawables.useSupportLibrary = true

还需要注意的是,这只发生在 Lolliop 之前的设备(Kitkat 及以下)上。 Lollipop 和更高版本完美运行。使用以下依赖项时,该标志可以正常工作:

compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
compile 'com.android.support:cardview-v7:23.4.0'

但是在使用这些依赖项时,我会遇到类似于使用标志之前遇到的崩溃:

compile 'com.android.support:support-v4:24.2.0'
compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:design:24.2.0'
compile 'com.android.support:cardview-v7:24.2.0'

这是崩溃的堆栈跟踪:

FATAL EXCEPTION: main
Process: com.badon.brigham.time, PID: 2070
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.badon.brigham.time/com.badon.brigham.time.MainActivity}: android.content.res.Resources$NotFoundException: File res/drawable/abc_vector_test.xml from drawable resource ID #0x7f02004f
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
      at android.app.ActivityThread.access$800(ActivityThread.java:135)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:136)
      at android.app.ActivityThread.main(ActivityThread.java:5017)
      at java.lang.reflect.Method.invokeNative(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:515)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
      at dalvik.system.NativeStart.main(Native Method)
    Caused by: android.content.res.Resources$NotFoundException: File res/drawable/abc_vector_test.xml from drawable resource ID #0x7f02004f
      at android.content.res.Resources.loadDrawable(Resources.java:2101)
      at android.content.res.Resources.getDrawable(Resources.java:700)
      at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:346)
      at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:194)
      at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:182)
      at android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup(AppCompatDrawableManager.java:717)
      at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:187)
      at android.support.v7.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:77)
      at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:127)
      at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:147)
      at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:27)
      at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:50)
      at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:201)
      at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:181)
      at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:521)
      at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:71)
      ...

我完全错过了什么吗?还是这已经是一个已知问题(我在 Google 上找不到任何东西)?任何帮助将不胜感激。

【问题讨论】:

  • 好像找不到资源,请确保它在正确的文件夹中
  • 这是在应用的 Debug 版本中发生,还是仅在 Release 中发生?
  • @JorgeMendez 这实际上是在支持库内部无法找到的资源。它必须与前棒棒糖设备的新矢量功能有关。 More Here
  • @lionscribe 我在应用程序的调试版本中遇到了这个问题 - 让我看看发布版本。
  • @lionscribe 是的,也发布了。

标签: android android-gradle-plugin android-support-library android-support-design


【解决方案1】:

呃...当这种情况发生时我讨厌它。你问一个问题,然后在几个小时后自己回答。无论如何,看起来好像我使用的是过时的构建工具版本。我所要做的就是在我的 gradle 中更改一行:

buildToolsVersion "24.0.1"

【讨论】:

  • 这并没有解决我在棒棒糖之前的 API 上的问题。我正在使用支持 lib 版本 24.2.0,构建工具 24.0.2,并且在使用 aapt 时提供 --no-version-vectors。
  • @HypotheticalintheClavicle 你有相同的堆栈跟踪和一切吗?
  • @谢谢。对我来说,compileSdkVersion 是 25,但 buildToolsVersion 是 21.1.2。我将其更正为 25.0.1 并工作
  • 也没有帮助我
  • 这里的秘密在于compileSdkVersionbuildToolsVersion和支持库版本都需要在同一个主版本号上(都以相同的主版本号开头,比如24,对于示例)。
【解决方案2】:

除了 Gradle 配置之外,对我来说,诀窍是在活动中添加这一行 onCreate()

@Override
public void onCreate() {
    super.onCreate();
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

您的 build.gradle(项目)如果使用 2.0+ 版本,请在您的 build.gradle(应用程序)中添加以下代码

// Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }

如果使用 1.5 版,请在您的 build.gradle(应用程序)中添加以下内容

// Gradle Plugin 1.5  
 android {  
   defaultConfig {  
     generatedDensities = []  
  }  

  // This is handled for you by the 2.0+ Gradle Plugin  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
 }

当然,在布局文件中,您应该使用 srcCompat 属性:

<ImageView  
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add"/>

【讨论】:

  • 它适用于 imageview 但实际上我需要 textview 的背景图像,请帮助
  • @shwetac 我不知道你是否可以这样做,但你可以尝试使用 imageView 作为背景图像,并在其上使用 textView,而不是只使用 textView。跨度>
  • moustard 我使用相同的 android:background 但出现错误。
  • 我没试过,但我很确定你不能这样做,你必须使用 app:srcCompat
  • 这帮助我解决了 React Switch 的 Android 4 问题。谢谢!
【解决方案3】:

在 24.2.0 中,v4 支持库已被 google 拆分为几个较小的模块:

com.android.support:support-compat:24.2.0

为新的框架 API 提供兼容性包装器,例如 Context.getDrawable() 和 View.performAccessibilityAction()。

com.android.support:support-core-utils:24.2.0

提供许多实用程序类,例如 AsyncTaskLoader 和 PermissionChecker。

com.android.support:support-core-ui:24.2.0

实现各种与 UI 相关的组件,例如 ViewPager、NestedScrollView 和 ExploreByTouchHelper。

com.android.support:support-media-compat:24.2.0

向后移植部分媒体框架,包括 MediaBrowser 和 MediaSession。

com.android.support:support-fragment:24.2.0

向后移植片段框架。该模块依赖于 support-compat、support-core-utils、support-core-ui 和 support-media-compat。

你可以看到所有的变化here

【讨论】:

  • 这不是我遇到崩溃的原因,因为我早在 24.0.0 就开始看到它。不过有趣的是,在 24.2.0 版本中,未找到资源的 xml 文件发生了变化,这可能与这种“拆分”有关。
  • 这是否意味着如果我们从 gradle 文件中删除 com.android.support:support-v4:24.2.0 并添加上面列出的 6 个依赖项,我们在技术上将获得所有相同的功能?
  • 在将我的项目更新到支持库的 25.0.1 版本后,我今天看到了同样的问题。老实说,Android 库的维护者没有理由为库设计中的又一次崩溃找借口。目前还没有迹象表明(我会继续寻找)我需要包含的库,以便我的项目可以找到 abc_vector_test.xml
【解决方案4】:

所以这个问题的答案是提醒 Android 维护者他们已经放弃并要求他们修复他们的库。

运行时项目中缺少文件abc_vector_text.xml,但如果您的项目一开始没有使用该文件,则不会在构建中标记该文件。该文件的名称表明它只是某些测试套件的一部分。

我正在使用以下依赖项:compile 'com.android.support:appcompat-v7:25.0.1'

因为此页面表明该文件在该库中找到:https://github.com/dandar3/android-support-v7-appcompat/blob/master/res/drawable/abc_vector_test.xml

然而,我仍然在运行时看到错误。

请注意,这是一个非官方 Android 项目的项目的 github 链接。我似乎无法在任何地方的官方项目构建中找到该文件。这再次表明这只是一个马虎维护的问题。这是我的堆栈跟踪以进行比较:

ontent.res.Resources$NotFoundException: File res/drawable/abc_vector_test.xml from drawable resource ID #0x7f020052
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.os.Looper.loop(Looper.java:137)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.app.ActivityThread.main(ActivityThread.java:5041)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at java.lang.reflect.Method.invokeNative(Native Method)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at java.lang.reflect.Method.invoke(Method.java:511)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at dalvik.system.NativeStart.main(Native Method)
01-02 00:02:23.130 E/AndroidRuntime( 3037): Caused by: android.content.res.Resources$NotFoundException: File res/drawable/abc_vector_test.xml from drawable resource ID #0x7f020052
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.content.res.Resources.loadDrawable(Resources.java:1953)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.content.res.Resources.getDrawable(Resources.java:660)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:374)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:200)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:188)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup(AppCompatDrawableManager.java:723)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:193)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:81)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:127)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:147)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:27)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:53)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:205)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:185)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:525)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:74)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at com.ccc.lib.activity.LoggingAppCompatActivity.onCreate(LoggingAppCompatActivity.java:416)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at com.ccc.lib.debugMode.DebugModeActivity.onCreate(DebugModeActivity.java:95)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at com.ccc.lib.activity.IBusActivity.onCreate(IBusActivity.java:46)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at com.ccc.lib.activity.MainActivity.onCreate(MainActivity.java:173)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.app.Activity.performCreate(Activity.java:5104)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     ... 11 more
01-02 00:02:23.130 E/AndroidRuntime( 3037): Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:881)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     at android.content.res.Resources.loadDrawable(Resources.java:1950)
01-02 00:02:23.130 E/AndroidRuntime( 3037):     ... 33 more

【讨论】:

【解决方案5】:

我在使用 dexguard 时遇到了同样的问题。 在您的配置文件中添加这一行:

-keepresourcexmlattributenames vector/*

【讨论】:

  • 我没有使用 DexGuard。我正在使用 ProGuard,但这仅适用于发布版本,并且我的错误发生在调试版本中。
  • @ialfa 我假设你从我之前的帖子中得到了那个解决方案。这就是我问它是否仅在发布版本中的原因。
  • @ialfa 我很高兴我帮助了别人!
【解决方案6】:

对我来说,它是项目根 build.gradle 文件中的旧构建工具包装器

dependencies {
    ....
    classpath 'com.android.tools.build:gradle:2.1.2'
}

而不是

classpath 'com.android.tools.build:gradle:1.X.X'

【讨论】:

    【解决方案7】:
     classpath 'com.android.tools.build:gradle:2.1.0'
    distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      相关资源
      最近更新 更多