Подтвердить что ты не робот

Поддержка библиотеки VectorDrawable Resources $NotFoundException

Я использую конструкторскую библиотеку поддержки версии 23.4.0. Я включил флаг gradle

    defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

Я использую инструменты для сборки версии 23.0.2, но все же я получаю исключение ResourcesNotFound на kitkat или ниже.

Это происходит, когда я использую android:drawableLeft или imageView.setImageResource(R.drawable.drawable_image)

И да, я помещаю это в каждое действие, где я использую drawables

  static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

Является ли это ошибкой в ​​библиотеке поддержки?

4b9b3361

Ответ 1

Мне потребовалось 3 отдельных вещи, чтобы заставить их работать с помощью библиотеки поддержки 23.4.0:

  • Добавьте это в build.gradle

    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
    
  • Добавьте следующее в onCreate вашего класса Application

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    
  • Для всех представлений xml, в которых вы устанавливаете векторный перенос, замените

    android:src
    

    с

    app:srcCompat
    

    и в коде замените это:

    imageView.setImageResource(...);
    

    с

    imageView.setImageDrawable(...);
    

Ответ 2

В дополнение к некоторым из ответов здесь: поддержка обратной совместимости для VectorDrawables поставляется с ценой и не работает во всех случаях.

В каких случаях это работает? Я сделал эту диаграмму, чтобы помочь (действителен для библиотеки поддержки 23.4.0, по крайней мере, 25.1.0).

VectorDrawable cheatsheet

Ответ 3

У нас была такая же проблема. Векторные рисунки не были видны на Киткате. Я решил эту проблему, добавив AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); в метод onCreate Activities.

До этого не забудьте добавить:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

и вызовите setImageResource для представления, которое вы используете для переноса вектора. Мой взгляд - ImageButton. У меня есть инструменты для создания SDK для Android версии 23.0.3.

Ответ 4

Попробуйте использовать:

imageView.setImageDrawable(VectorDrawableCompat.create(getResources(), drawableRes, null));

Вам не нужно добавлять AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); таким образом.

Просто раздуйте векторные векторные элементы с помощью VectorDrawableCompat, и все будет установлено.

Ответ 5

defaultConfig {
  vectorDrawables.useSupportLibrary = true
}

используйте это в app.gradle

Затем используйте AppCompatDrawableManager для setDrawable и getDrawable. Работает для меня

Ответ 6

Поддержка векторных чертежей в таких местах, как android:drawableLeft, была отключена в библиотеке поддержки 23.3. Было объявлено на Google+:

weve решила удалить функциональность, позволяющую использовать вектор выходы из ресурсов на устройствах до Lollipop из-за обнаруженных проблем в реализации в версии 23.2.0/23.2.1. Использование приложения: srcCompat и setImageResource() продолжает работать.

Ссылки на вопросы:

Однако, если вы можете жить с этими проблемами, в 23.4 вы можете снова включить эту функцию, используя AppCompatDelegate.setCompatVectorFromResourcesEnabled().

Если вам интересно, как это работает, лучшим человеком, которого можно научиться, является Крис Банес, который создал эту функциональность. Он подробно объясняет в своем блоге.

Ответ 7

изменить

imageView.setImageResource(R.drawable.drawable_image)

to

imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.drawable_image));

если вы хотите использовать vectordrawable в xml, используйте это:

app:srcCompat="@drawable/drawable_image"

Ответ 8

У меня была аналогичная проблема давно, это не сработало, установив

vectorDrawables.useSupportLibrary = true

работал только тогда, когда я создал папку "mipmap", а используемый код

imageView.setImageResource (R.mipmap.drawable_image)

Здесь больше информации

Ответ 9

API 16 анимация
Наращивание Drawable

`VectorDrawable` и `AnimatedVectorDrawable` в этой библиотеке поддержки можно раздуть следующим образом:

  • Вызов статических методов getDrawable():
//This will only inflate a drawable with <vector> as the root element
VectorDrawable.getDrawable(context, R.drawable.ic_arrow_vector);

//This will only inflate a drawable with <animated-vector> as the root element
AnimatedVectorDrawable.getDrawable(context, R.drawable.ic_arrow_to_menu_animated_vector);

// This will inflate any drawable and will auto-fallback to the lollipop implementation on api 21+ devices
ResourcesCompat.getDrawable(context, R.drawable.any_drawable);

При раздувании Drawable в java-коде рекомендуется всегда использовать ResourcesCompat.getDrawable(), так как это применимо, если применимо, Lullipop. Это позволяет системе кэшировать Drawable ConstantState и, следовательно, более эффективно.
Библиотека имеет следующие морфовые (двунаправленные) анимации:

анимация анимации Play-Pause анимация анимации Play-Stop Arrow-Hamburger menu morph анимация анимации
Как вы можете видеть, я произвел вышеупомянутое изображение на моем телефоне API 16:
import com.wnafee.vector.compat.AnimatedVectorDrawable;
mdrawable = (AnimatedVectorDrawable) AnimatedVectorDrawable.getDrawable(this.getApplicationContext(), R.drawable.consolidated_animated_vector);

Посмотрите на github README для vector-compat здесь: https://github.com/wnafee/vector-compat
Это устранит вашу проблему (вплоть до API 14), если вы объедините ее с вашим модулем приложения build.gradle dependencies (обычно в конце файла):

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
//Trying to FIX Binary XML file line #2: invalid drawable tag animated-vector
    compile 'com.android.support:appcompat-v7:25.0.0'
    compile 'com.android.support:design:25.0.0'
//not needed
//  compile 'com.android.support:support-vector-drawable:25.0.0'
    compile 'com.wnafee:vector-compat:1.0.5'//*******holy grail *******https://github.com/wnafee/vector-compat
//  Failed to resolve: com.android.support:support-animated-vector-drawable:25.0.0
//not needed
//  compile 'com.android.support:support-animated-vector-drawable:25.0.0'
}

Ответ 10

Не помещайте свои векторы в drawable-anydpi , старые устройства не поддерживают это

поместите их в drawable