Vector Drawables标志在支持库24+上不起作用

Bri*_* B. 23 android android-support-library android-gradle-plugin android-support-design

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

vectorDrawables.useSupportLibrary = true
Run Code Online (Sandbox Code Playgroud)

同样重要的是要注意,这只发生在前Lolliop设备(Kitkat及以下)上.棒棒糖和向上工作完美.使用以下依赖项时,该标志正常工作:

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'
Run Code Online (Sandbox Code Playgroud)

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

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'
Run Code Online (Sandbox Code Playgroud)

这是崩溃的堆栈跟踪:

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)
      ...
Run Code Online (Sandbox Code Playgroud)

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

Bri*_* B. 30

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

buildToolsVersion "24.0.1"
Run Code Online (Sandbox Code Playgroud)

  • 这里的秘诀是`compileSdkVersion`,`buildToolsVersion`和支持库版本都需要在相同的主版本号上(例如,所有主要版本都以相同的主编号开头,例如24). (4认同)
  • 这并没有解决我在Lollipop前API上的问题.我正在使用支持lib版本24.2.0,构建工具24.0.2,我在使用aapt时提供--no-version-vectors. (3认同)

Mr.*_*ard 11

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

@Override
public void onCreate() {
    super.onCreate();
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

你的build.gradle(项目)如果使用版本2.0+在build.gradle(app)中添加以下代码

// Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }
Run Code Online (Sandbox Code Playgroud)

并且,如果使用版本1.5,请在build.gradle(app)中添加以下内容

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

  // This is handled for you by the 2.0+ Gradle Plugin  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
 }
Run Code Online (Sandbox Code Playgroud)

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

<ImageView  
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add"/>
Run Code Online (Sandbox Code Playgroud)