web-dev-qa-db-fra.com

Vecteur d'étiquette dessinable non valide

Im essayant d'utiliser des drawables vectoriels sur les appareils pré Lollipop. J'ai fait tout comme indiqué ici mais je reçois toujours ce plantage.

build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:2.0.0-beta6'
    }
}
apply plugin: 'com.Android.application'

repositories {
    maven { url 'http://maven.Android-forever.com' }
    jcenter()
}

Android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.test.app"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.Android.support:appcompat-v7:23.2.0'
    compile 'com.Android.support:design:23.2.0'
    compile "de.greenrobot:eventbus:2.4.0"
    compile 'de.greenrobot:greendao:2.1.0'
    compile "com.af:Android-utility:1.0.0.9"
    compile project(':volleyplus')
    compile project (':libvlc')
}

triangle.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/triangle_v"/>
</selector>

triangle_v.xml

<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:height="100dp"
    Android:width="100dp"
    Android:viewportHeight="100"
    Android:viewportWidth="100">

<path
    Android:name="triangle"
    Android:fillColor="#FF0000"
    Android:pathData="m 50,0 l 50,100 -100,0 z"/>

</vector>

layout.xml

<ImageView
      Android:layout_width="match_parent"
      Android:layout_height="match_parent"
      Android:background="@drawable/triangle"/>

J'ai aussi essayé app:srcCompat et dans ce cas, drawable ne s'affiche pas.

38
pedja

Le problème était que mon activité n'allongeait pas AppCompatActivity mais régulière Activity.

Ceci n'est spécifié dans aucune documentation/exemple pour les dessins vectoriels de support

18
pedja

Ce code va fonctionner avec vector si vous utilisez
vectorDrawables.useSupportLibrary = true

Et changez Android:src à app:srcCompat.

Par exemple,

<ImageView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:src="@drawable/triangle"/>

à

<ImageView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    app:srcCompat="@drawable/triangle"/>
29

J'ai rencontré un problème similaire et la propre réponse de @ pedja est utile. Plus généralement, comme mentionné dans article de Chris Banes sur la compatibilité avec les dessins vectoriels , la bibliothèque de support fonctionne en injectant sa version de ImageView sur celle du système sur pré-L via quelques hooks. Cela nécessite implicitement l'utilisation des versions AppCompat des classes, telles que AppCompatActivity.

Dans mon cas, le vecteur dessinable est utilisé dans une vue autonome de type toast sans activité associée, en utilisant le contexte d'application. J'ai fini par utiliser AppCompatImageView dans la définition de mise en page xml directement, c'est-à-dire quelque chose comme

<Android.support.v7.widget.AppCompatImageView
             Android:id="@+id/some_id"
             Android:layout_width="24dp"
             Android:layout_height="24dp"
             Android:src="@drawable/selector_referencing_vector_drawable"/>

il n'y a donc pas besoin du mécanisme magique de "crochet". Comme testé, cela fonctionne également avec la classe Activity sans avoir besoin d'utiliser AppCompatActivity. Tout ce qui précède a été fait sans mise à niveau vers 23.2.1, ce qui a résolu un problème différent.

27
headuck

J'ai aussi ce problème lors du chargement de vecteurs à partir d'un sélecteur sur des appareils pré-Lollipop:

Utilisez AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) dans votre méthode onCreate:

Définit si les dessins vectoriels sur les anciennes plates-formes (<API 21) peuvent être utilisés dans les ressources Android.graphics.drawable.DrawableContainer. Lorsqu'il est activé, AppCompat peut intercepter une certaine inflation tirable du cadre, ce qui permet une inflation implicite des dessinables vectoriels dans les ressources Android.graphics.drawable.DrawableContainer.

protected final void onCreate(Bundle savedInstanceState) {
         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
         super.onCreate(savedInstanceState);
         ...
25
Aldasa

Les réponses données ici ignorent une situation où vous souhaitez ajouter un dessinable à une vue de texte car cela donne la même erreur. dans mon cas j'avais

<TextView .... Android:drawableLeft="some_vectore_drawable" />

Je n'ai pas pu trouver de solution, j'ai donc supprimé cette ligne du code xml et l'ai mise dans mon Java de cette manière)

Drawable somevectordrable = AppCompatDrawableManager.get().getDrawable(context, R.drawable.somevectordrawable);
mytextview.setCompoundDrawableWithIntrinsicBounds(somevectordrable, null, null, null);

Clarification du code,

  1. Obtenez le vecteur dessinable à partir du dossier drawables à l'aide d'AppCompatDrawableManager

  2. Définissez le dessin que nous venons de recevoir comme dessin à gauche sur notre affichage de texte

10
nada

Vous devez également inclure la nouvelle bibliothèque de supports vectoriels:

compile 'com.Android.support:support-vector-drawable:23.2.0'
6
Gaëtan

Cela fonctionne avec 23.2.0 ou 23.4.0, pas 23.3.0. Sérieusement Google!

Tout d'abord, cette fonctionnalité a été initialement publiée dans 23.2.0, mais nous avons ensuite trouvé des problèmes d'utilisation de la mémoire et de mise à jour de la configuration, nous l'avons donc supprimée dans 23.3.0. Dans la version 23.4.0 (techniquement une version de correctif), nous avons rajouté la même fonctionnalité mais derrière un indicateur que vous devez activer manuellement.

Réf: https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88#.waicp19gh

6
Nishant Shah

C'est tout ce que j'aime sur Internet, et ça marche pour moi. Vérifiez lequel vous manquez.

1) À l'intérieur build.gradle

 Android {
        ...
        defaultConfig {
            ...
            vectorDrawables.useSupportLibrary = true
        }
  }

2) Doit utiliser buildToolsVersion '27.0.3' et compile 'com.Android.support:appcompat-v7:27.0.3' code de version similaire.

3) Utilisez la version supérieure puis à 3 niveaux
classpath 'com.Android.tools.build:gradle:3.0.1'

4) Pour ImageView utilisez app:srcCompat

xmlns:app="http://schemas.Android.com/apk/res-auto"
app:srcCompat="@drawable/ic_logo"

5) Mais si vous avez besoin de Android:drawableLeftou Android:drawableRigth etc alors:

ic_logo.xml (vecteur xml)

<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:width="@dimen/home.button.icon"
    Android:height="@dimen/home.button.icon"
    Android:viewportWidth="24.0"
    Android:viewportHeight="24.0"
    tools:ignore="VectorRaster">
    <path
        Android:fillColor="#FFFFFF"
        Android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

ic_logo_select.xml (sélecteur de vecteur)

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_checked="true"
        Android:drawable="@drawable/ic_logo" />
    <item Android:drawable="@drawable/ic_logo" />
</selector>

Vous pouvez maintenant utiliser Android: drawableLeft ou Android: drawableRight

<Android.support.v7.widget.AppCompatButton
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:drawableLeft="@drawable/ic_logo_select"/>

6) Et à la fin, setCompatVectorFromResourcesEnabled = true dans static qui se charge avant la méthode principale.

public class MainActivity extends AppCompatActivity {
     static {
            AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
     }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ....
    }
}
5
Md Imran Choudhury

Si vous rencontrez ce problème d'exception avec drawableLeft, drawableRight, drawableTop, drawableXxx etc ... Et votre projet buildToolsVersion> 26.0.2.

Allez vérifier le fichier de niveau de votre application, supprimez vectorDrawables.useSupportLibrary = true s'il existe, le crash a disparu.

Cela parce que buildTools supprimera les ressources vectorielles après 26.0.2, mais en quelque sorte en conflit avec vectorDrawables.useSupportLibrary = true.

Testé le 27/03/2019.

(si vous ne trouvez pas votre buildToolsVersion dans votre fichier Gradle au niveau de l'application, cela signifie que vous utilisez Android plugin pour Gradle 3.0.0 ou supérieur, votre projet utilise automatiquement une version par défaut des outils de construction spécifiés par le plugin. Dans ce cas, votre buildToolsVersion déjà supérieur à 26.0.2)

2
Loyea

Il s'agit du bug support-v4, appcompat-v7 library v23.2.0, il apparaît dans l'API 19. @tim fournit un lien vers ce problème de bug.

Vous pouvez passer à la nouvelle bibliothèque 23.2.1 et le bug est maintenant corrigé.

1
sytolk

Si vous rencontrez ce problème avec drawableLeft/drawableStart, etc., il existe une solution simple, si vous utilisez la liaison de données.

Au lieu de:

Android:drawableLeft="@drawable/somevector" ❌

Faire:

Android:drawableLeft="@{@drawable/somevector}" ✅

Cela fonctionne car la liaison de données générera au moment de la compilation du code qui récupère le dessinable de manière compatible.

1
BoD

J'ai trouvé ce problème sur code.google.

Il semble que ce soit le même problème que vous. est-ce que cela aide? https://code.google.com/p/Android/issues/detail?id=20184

0
tim

Si vous vous voyez utiliser <Android.support.v7.widget.AppCompatImageView lors du chargement d'un vecteur dessinable, il peut être préférable d'étendre AppCompatActivity au lieu de Activity et de revenir à l'utilisation régulière de <ImageView...app:srcCompat="@drawable/...

0
Cristhian Escobar