android - library - support support v4 28




Флаг Vector Drawables не работает в библиотеке поддержки 24+ (5)

Сегодня кажется, что Android Nougat released . Таким образом, я больше рад, чем когда-либо, оптимизировать свое приложение для новых функций, таких как разделенный экран. Я хотел бы нажать версию моего приложения, предназначенного для SDK версии 24 чтобы пользователи не уведомлялись о том, что мое приложение может не работать в режиме разделения экрана. Однако это означает, что я также должен обновить версию 24 библиотеки поддержки. Как и многие другие, у меня возникла проблема при обновлении до версии 23.2.0 библиотеки поддержки. Однако я последовал за этим ответом, и он исправил мою проблему. Теперь проблема возвращается с версии 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)? Любая помощь будет оценена по достоинству.


В 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

Backports части медиа-среды, включая MediaBrowser и MediaSession.

com.android.support:support-fragment:24.2.0

Возвращает фреймворк. Этот модуль имеет зависимости от поддержки-совместимости, поддержки-core-utils, поддержки-core-ui и поддержки-media-compat.

Здесь вы можете увидеть все изменения


В дополнение к конфигурации 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 (app)

// 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"/>

У меня была такая же проблема с dexguard. Добавьте эту строку в файл конфигурации:

-keepresourcexmlattributenames vector/*

Фу ... Ненавижу, когда это происходит. Вы задаете вопрос, а затем отвечаете на него через несколько часов. В любом случае, похоже, я использовал устаревшую версию инструментов для сборки. Все, что мне нужно было сделать, это изменить одну строку в моей градиенте:

buildToolsVersion "24.0.1"

 classpath 'com.android.tools.build:gradle:2.1.0'
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip