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.
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
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"/>
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.
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);
...
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,
Obtenez le vecteur dessinable à partir du dossier drawables à l'aide d'AppCompatDrawableManager
Définissez le dessin que nous venons de recevoir comme dessin à gauche sur notre affichage de texte
Vous devez également inclure la nouvelle bibliothèque de supports vectoriels:
compile 'com.Android.support:support-vector-drawable:23.2.0'
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
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 niveauxclasspath '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:drawableLeft
ou 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);
....
}
}
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)
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é.
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.
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
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/...