Поддержка библиотеки 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);
}
Является ли это ошибкой в библиотеке поддержки?
Ответы
Ответ 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
Наращивание 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