41

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

defaultConfig { 
    vectorDrawables.useSupportLibrary = true 
} 

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

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

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

вводимых коэффициент
static { 
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
} 

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

+2

перед той же проблемой, как вы .did вы получили какое-либо решение для Android: drawableLeft? – Sayem

+1

@Sayem No.Мне пришлось полностью удалить графику с кнопки. Хотя вы можете предоставить отдельный png как доступный. – Arka

+0

да .. я уже делал это так же, как ваше предложение. – Sayem

ответ

3

изменение

imageView.setImageResource(R.drawable.drawable_image) 

в

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

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

app:srcCompat="@drawable/drawable_image" 
+0

Ваш метод setImageDrawable работает. Но все же кнопка drawableLeft не работает. – Arka

+0

Это приводит к сбою на старых устройствах. –

+0

Это не работает. Вместо этого используйте один из других ответов. – Sakiboy

1

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

vectorDrawables.useSupportLibrary = true

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

imageView.setImageResource (R.mipmap.drawable_image)

Он имеет более Info here

22

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

Перед этим не забудьте добавить:

defaultConfig { 
    vectorDrawables.useSupportLibrary = true 
} 

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

+2

. Моя проблема в том, что даже 'AppCompatDelegate.setCompatVectorFromResourcesEnabled (true);' не работает. Такое же исключение ResourceNotFound. – Arka

+0

@Arka, вы можете попробовать позвонить в onCreate method of Activities. – Murat

+1

Вы должны иметь возможность добавить его в класс onCreate вашего приложения. Кажется, это работает для меня. –

5

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

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

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

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

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

41

Потребовалось 3 отдельные вещи для меня, чтобы получить эту работу, используя библиотеку поддержки 23.4.0:

  1. Добавить это build.gradle

    defaultConfig { 
        vectorDrawables.useSupportLibrary = true 
    } 
    
  2. добавьте следующую строку в OnCreate из ваш класс приложения

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

    android:src 
    

    с

    app:srcCompat 
    

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

    imageView.setImageResource(...); 
    

    с

    imageView.setImageDrawable(...); 
    
+0

это применимо, даже если моя деятельность основана на AppCompatActivity? AppCompatActivity уже использует AppCompatDelegate. – Thupten

+0

Просто используйте 'AppCompatImageView' вместо' ImageView'. Задача решена. Нет необходимости хранить png для более низких версий. Даже 'srcCompat' не требуется. –

+0

Я сделал шаги с 1 по 3 (на третьем шаге используется 'app: srcCompat'). Тем не менее, я по-прежнему вижу исключение «XmlPullParserException: двоичная строка XML-файла №4: недопустимый вектор тегов-меток». Похоже, что тег 'vector' в XML не распознается на этом устройстве KitKat? –

17

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

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

Вы не должны добавлять AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); этот путь.

Просто надуйте свои векторные чертежи, используя VectorDrawableCompat, и все готово.

+2

У этого есть 2 аргумента вместо 3: 'AppCompatDrawableManager.get(). GetDrawable (context, resId);' –

1

API 16 animation
Раздувание 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(), так как это относится к запасу Lollipop, когда это применимо. Это позволяет системе кэшировать Drawable ConstantState и, следовательно, более эффективно.
Библиотеки имеет следующую морф (двунаправленная) анимация:

  • Play-Pause морфинг анимация
  • Play-Stop морфинг анимация
  • Arrow-Hamburger меню морфинг анимация

  • Как вы можете видите ли, я произвел над изображением на моем 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.gradledependencies (обычно в конце файла):

    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' 
    } 
    
    6
    defaultConfig { 
        vectorDrawables.useSupportLibrary = true 
    } 
    

    использовать это в app.gradle

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

    32

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

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

    VectorDrawable cheatsheet

    +0

    Он НЕ работает с 'setImageResource' для KitKat (4.4.4) (и, как я полагаю, ниже), только это работает https://stackoverflow.com/a/35918375/7767664 – user924

    0

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

    положить их в drawable

    1

    Извините за опоздание на партию, но этот ответ может помочь пользователям, которые хотите включить флаг AppCompatDelegate.setCompatVectorFromResourcesEnabled (true); для всех видов деятельности.

    1. Создать класс, который распространяется на заявки (android.app.Application)

    public class MyApplicationClass extends Application 
    { 
        @Override 
        public void onCreate() 
        { 
         super.onCreate(); 
        } 
    } 
    

    2. Зайдем к Manifest.xml и добавьте следующую строку в тег

    <application 
        android:name=".MyApplicationClass" 
        android:allowBackup="true" 
        android:icon="@mipmap/ic_launcher" 
        android:label="@string/app_name" 
        android:roundIcon="@mipmap/ic_launcher_round" 
        android:supportsRtl="true" 
        android:theme="@style/AppTheme"> 
        ... 
    </application> 
    

    3. Добавьте следующий код выше OnCreate в MyApplicationClass.java

    // This flag should be set to true to enable VectorDrawable support for API < 21 
    static 
    { 
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
    } 
    

    Полный код для MyApplicationClass.java

    import android.app.Application; 
    import android.support.v7.app.AppCompatDelegate; 
    
    /** 
    * Created by Gaurav Lonkar on 23-Dec-17. 
    */ 
    
    public class MyApplicationClass extends Application 
    { 
        // This flag should be set to true to enable VectorDrawable support for API < 21 
        static 
        { 
         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
        } 
    
        @Override 
        public void onCreate() 
        { 
         super.onCreate(); 
        } 
    } 
    
    Смежные вопросы