Lorsque j'utilise des ressources VectorDrawable dans une vue de texte ou une vue d'image, j'obtiens un crash d'exécution lors de l'utilisation de "android: DrawableRight" / "android: DrawableEnd" / "android: DrawableStart" / "android: DrawableLeft".
L'application se compilera correctement sans aucun avertissement.
j'utilise
- Gradle 1.5
- Bibliothèque de support 23.2 ('com.android.support:appcompat-v7:23.2.0')
Ce que j'ai trouvé, c'est que je peux attribuer des SVG par programme en Java sans plantages comme celui-ci.
TextView tv = (TextView) findViewById(R.id.textView);
tv.setCompoundDrawablesWithIntrinsicBounds(null,null, getResources().getDrawable(R.drawable.ic_accessible_white_36px),null);
(Je soupçonne qu'il s'agit d'un bogue de la bibliothèque de support pour 23.2.)
Mais est-il possible d'utiliser drawableRight, etc. pour les actifs SVG?
Voici ma mise en page
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="au.com.angryitguy.testsvg.MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="@drawable/ic_accessible_white_36px"
android:background="@color/colorPrimary"
android:textColor="#FFFFFF"
android:textSize="22sp"
android:text="Hello World!"/>
</RelativeLayout>
Voici mon activité
package au.com.angryitguy.testsvg;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Voici l'élément VectorDrawable non modifié du site de conception matérielle de Google.
<vector android:height="24dp" android:viewportHeight="24.0"
android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"/>
<path android:fillColor="#FFFFFF" android:pathData="M19,13v-2c-1.54,0.02 -3.09,-0.75 -4.07,-1.83l-1.29,-1.43c-0.17,-0.19 -0.38,-0.34 -0.61,-0.45 -0.01,0 -0.01,-0.01 -0.02,-0.01L13,7.28c-0.35,-0.2 -0.75,-0.3 -1.19,-0.26C10.76,7.11 10,8.04 10,9.09L10,15c0,1.1 0.9,2 2,2h5v5h2v-5.5c0,-1.1 -0.9,-2 -2,-2h-3v-3.45c1.29,1.07 3.25,1.94 5,1.95zM12.83,18c-0.41,1.16 -1.52,2 -2.83,2 -1.66,0 -3,-1.34 -3,-3 0,-1.31 0.84,-2.41 2,-2.83L9,12.1c-2.28,0.46 -4,2.48 -4,4.9 0,2.76 2.24,5 5,5 2.42,0 4.44,-1.72 4.9,-4h-2.07z"/>
</vector>
Voici mon app build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "au.com.angryitguy.testsvg"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
// Stops the Gradle plugin’s automatic rasterization of vectors
generatedDensities = []
}
// Flag to tell aapt to keep the attribute ids around
aaptOptions {
additionalParameters "--no-version-vectors"
}
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'
}
Voici le crash. (Notez les erreurs de gonflage qui font référence à la vue de texte.)
java.lang.RuntimeException: Unable to start activity ComponentInfo{
au.com.angryitguy.testsvg/au.com.angryitguy.testsvg.MainActivity}:
android.view.InflateException: Binary XML file line #13:
Error inflating class TextView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
...
Caused by: android.view.InflateException:
Binary XML file line #13: Error inflating class TextView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:5008)
...
Caused by: android.content.res.Resources$NotFoundException:
File res/drawable/ic_accessible_white_36px.xml from drawable resource ID #0x7f02004b
at android.content.res.Resources.loadDrawable(Resources.java:1918)
at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
at android.widget.TextView.<init>(TextView.java:622)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:60)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:56)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963)
at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:5008)
...
Caused by: org.xmlpull.v1.XmlPullParserException:
Binary XML file line #1: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:877)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:818)
at android.content.res.Resources.loadDrawable(Resources.java:1915)
at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
at android.widget.TextView.<init>(TextView.java:622)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:60)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:56)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963)
at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:5008)
...
Réponses:
Oui
AppCompatTextView maintenant supports
app:drawableLeftCompat
,app:drawableTopCompat
,app:drawableRightCompat
,app:drawableBottomCompat
,app:drawableStartCompat
etapp:drawableEndCompat
dessinables composés, supportant backported types étirables tels queVectorDrawableCompat
.Incluez ceci dans votre fichier gradle
Dans votre vue texte, vous pouvez utiliser
Si vous rencontrez des problèmes lors de l'utilisation de app: drawableLeftCompat, app: drawableStartCompat dans les boutons, vous devrez mettre à jour votre bibliothèque pour
androidx.appcompat: appcompat: 1.2.0-alpha01
ils avaient un bug sur
androidx.appcompat: appcompat: 1.1.0-alpha01
vous pouvez voir les documents
Ou si vous ne souhaitez pas encore mettre à jour, alors:
Comme il semble que Google ne fera rien pour résoudre ce problème de sitôt, j'ai dû proposer une solution réutilisable plus solide pour toutes mes applications:
Ajoutez d'abord des attributs TextView personnalisés dans le fichier attrs.xml de votre application "res / values / attrs.xml" :
Ensuite, créez une classe TextView personnalisée comme ceci:
Vous pouvez désormais l'utiliser facilement dans toutes les mises en page grâce à vos attributs personnalisés:
J'espère que cela t'aides :)
la source
vectorDrawables { useSupportLibrary = true }
de monbuild.gradle
comme cette réponse le suggère a fonctionné pour moi.vectorDrawables useSupportLibrary = true
ligne du gradle. Lorsque vous le supprimez, vous pouvez toujours placer des vecteurs dans vos vues, mais ils sont redimensionnés de la même manière que les png, ce qui signifie qu'ils seront étirés et devenir granuleux. Si vous voulez que les appareils inférieurs à 5.0 / API21 redimensionnent correctement les vecteurs pour qu'ils paraissent nets, vous devez utiliser cette ligne dans le fichier gradle. Mettre cette ligne en invoque l'EDI pour trouver les zones où vous utilisez des vecteurs de manière incorrecte et vous devez ensuite utiliser leapp:srcCompat
via XML ou le définir via le code avecVectorDrawableCompat.create()
app:drawableEndCompat
pour un meilleur support RTL? CausesetCompoundDrawablesRelativeWithIntrinsicBounds
nécessite au moins le niveau 17 d'API.Cette solution n'est plus correcte. À partir de la version 23.3.0, les dessins vectoriels ne peuvent être chargés que via l'application: srcCompat ou setImageResource ()
Essayez d'envelopper votre vecteur dessiné dans une liste de calques ou un sélecteur:
ic_accessible_white_wrapped.xml:
la source
Le meilleur moyen que j'ai trouvé:
la source
Drawable drawable = VectorDrawableCompat.create(getResources(), status.getIconResId(), wrapper.getTheme()); statusButton.setCompoundDrawablesRelativeWithIntrinsicBounds(null, drawable, null, null);
setCompoundDrawablesWithIntrinsicBounds
est 17 . Sinon, cela fonctionne très bien.Pour compléter certaines des réponses ici: vous pouvez faire fonctionner VectorDrawable comme
drawableLeft
(etc.), mais cela dépend de la version de la bibliothèque de support et cela a un prix.Dans quels cas ça marche? J'ai fait ce diagramme pour vous aider (valable pour Support Library 23.4.0 à - au moins - 25.1.0).
la source
setCompatVectorFromResourcesEnabled
From 23.3.0 version vector drawables can only be loaded via app:srcCompat or setImageResource()
donc cette solution est obsolète et ne fonctionnera passetCompatVectorFromSourcesEnabled(true)
permet de charger des vectordrawablesandroid:background
sur Android 4.x. Donc merci! (Vous devez envelopper le vecteur réel dans une seule liste deAucune des autres réponses n'a fonctionné, voici comment j'ai ajouté un
VectorDrawable
à unTextView
, que vous devriez utiliserVectorDrawableCompat.create()
lorsque vous traitezVectorDrawables
ciAndroid L
- dessous :Bref, doux et précis!
la source
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
la source
Il est possible de définir directement des dessins vectoriels en XML, mais vous avez inclus le framework de liaison de données.
Ecrivez
et enveloppez votre mise en page entière dans une
<layout>
balise, donc fondamentalement votre xml ressemblerait à:Pour activer le cadre de liaison de données, ajoutez simplement
Vous n'avez pas besoin d'utiliser d'autres fonctionnalités de la bibliothèque de liaison
ÉDITER:
Bien sûr, si vous souhaitez utiliser des dessins vectoriels pré-Lollipop, vous devez activer les dessins vectoriels de support en utilisant
vectorDrawables.useSupportLibrary = true
Donc, vous avez
build.gradle
besoin de 2 nouvelles commandes:merci à rkmax pour la remarque
la source
vectorDrawables.useSupportLibrary
sur app / build.gradle et également ajouter AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) sur l'activitébuild.gradle
qui pourrait être la raison pour laquelle cela ne fonctionne pasJ'ai parcouru toutes les réponses et en utilisant le dernier studio Android 3.0.1 et la bibliothèque de support AppCompat 26.1.0, je peux vous assurer que cela fonctionne très bien.
Dans le fichier build.gradle (app)
Et dans l'extension d'activité,
AppcompatActivity
incluez ces méthodes extérieures, c'est-à-dire unstatic
blocou si vous voulez que cela soit appliqué à l'ensemble de l'application, incluez simplement cette ligne dans la classe d'extension de
Application
classeTextview en xml
account_drawableleft_selector.xml
la source
drawableRight
pourTextView
en XML?À partir de androidx.appcompat: appcompat: 1.1.0, vous pouvez utiliser
la source
Je suis si tard pour répondre à cette question que je suis resté en retard avec ce problème. J'ai eu le même problème avec les drawables svg / vector avec TextView. Au lieu de créer votre propre dessin personnalisé, je suis en mesure de résoudre mon problème avec 2 lignes de code comme ci-dessous:
J'espère que cela vous aidera.
la source
L
appareils pré .VectorDrawables
tous les appareils exécutant pré-L, il suffit de dire. Soyez prudent lorsque vous utilisez cette réponse, car il existe des API plus sûres et plus précises à utiliser.J'ai conçu une petite bibliothèque pour cela - textview-rich-drawable (elle prend également en charge la définition de la taille et de la teinte des composés).
Et la dépendance
la source
Si vous utilisez la liaison, il existe un autre moyen magique d'utiliser la même approche pour utiliser des vecteurs dans un TextView. Les emballer comme:
Cela fonctionnera comme par magie, je n'ai pas enquêté sur ce qui se passe dans les coulisses, mais je suppose que TextView utilise la
getDrawable
méthode duAppCompatResources
ou similaire.la source
Sur la base de la réponse de Behzad Bahmanyar , j'ai remarqué que je ne pouvais pas utiliser les attributs normaux d'Android pour les fichiers png normaux:
car il serait remplacé par null dans
si le
app:drawableTopCompat
n'était pas défini, mais l'android:drawableTop
était (par exemple).Voici la solution complète:
la source
Dans le fichier build.gradle (app)
...
use (lors de la liaison de données)
Ou (normal)
la source
Utilisation de l'utilisation de Vector Drawables
Kotlin
Java
la source
Pour une compatibilité descendante, utilisez:
la source
J'utilise un adaptateur de liaison pour résoudre ce problème
et aussi en utilisant de cette manière dans ma mise en page
probablement vectorDrawables.useSupportLibrary = true dans la configuration par défaut est nécessaire
la source