Wenn ich VectorDrawable-Assets in einer Text- oder Bildansicht verwende, tritt bei Verwendung von "android: DrawableRight" / "android: DrawableEnd" / "android: DrawableStart" / "android: DrawableLeft" ein Laufzeitabsturz auf.
Die App wird ohne Warnungen problemlos kompiliert.
ich benutze
- Gradle 1.5
- Support Library 23.2 ('com.android.support:appcompat-v7:23.2.0')
Was ich jedoch festgestellt habe, ist, dass ich SVGs in Java programmgesteuert zuweisen kann, ohne dass es zu solchen Abstürzen kommt.
TextView tv = (TextView) findViewById(R.id.textView);
tv.setCompoundDrawablesWithIntrinsicBounds(null,null, getResources().getDrawable(R.drawable.ic_accessible_white_36px),null);
(Ich vermute, dies ist ein Fehler in der Support-Bibliothek für 23.2.)
Aber ist es möglich, drawableRight usw. für SVG-Assets zu verwenden?
Hier ist mein Layout
<?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>
Hier ist meine Aktivität
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);
}
}
Hier ist das unveränderte VectorDrawable-Asset von Googles Materialdesign-Website.
<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>
Hier ist meine 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'
}
Hier ist der Absturz. (Beachten Sie die Aufblasfehler, die auf die Textansicht verweisen.)
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)
...
Antworten:
Ja
AppCompatTextView jetzt Stützen
app:drawableLeftCompat
,app:drawableTopCompat
,app:drawableRightCompat
,app:drawableBottomCompat
,app:drawableStartCompat
undapp:drawableEndCompat
Verbindung Drawables, drawable Typen zurück portiert Stütz wieVectorDrawableCompat
.Fügen Sie dies in Ihre Gradle-Datei ein
In Ihrer Textansicht können Sie verwenden
Wenn Sie Probleme bei der Verwendung von app: drawableLeftCompat, app: drawableStartCompat in Schaltflächen haben, müssen Sie Ihre Bibliothek auf aktualisieren
androidx.appcompat: appcompat: 1.2.0-alpha01
Sie hatten einen Fehler
androidx.appcompat: appcompat: 1.1.0-alpha01
Sie können die Dokumente sehen
Oder wenn Sie noch nicht aktualisieren möchten, dann:
Da Google anscheinend in naher Zukunft nichts gegen dieses Problem unternehmen wird, musste ich für alle meine Apps eine solide wiederverwendbare Lösung finden:
Fügen Sie zuerst benutzerdefinierte TextView- Attribute in die Datei attrs.xml Ihrer App "res / values / attrs.xml" ein :
Erstellen Sie dann eine benutzerdefinierte TextView-Klasse wie folgt:
Jetzt können Sie es einfach in beliebigen Layouts mit Ihren benutzerdefinierten Attributen verwenden:
Hoffe das hilft :)
quelle
vectorDrawables { useSupportLibrary = true }
von meiner,build.gradle
wie diese Antwort nahelegt, hat für mich funktioniert.vectorDrawables useSupportLibrary = true
Linie aus dem Gradle. Wenn Sie es entfernen, können Sie weiterhin Vektoren in Ihre Ansichten einfügen, deren Größe jedoch auf die gleiche Weise wie pngs geändert wird. Dies bedeutet, dass sie gedehnt werden und körnig werden. Wenn Geräte unter 5.0 / API21 die Größe der Vektoren tatsächlich korrekt ändern sollen, damit sie klar aussehen, müssen Sie diese Zeile in der Gradle-Datei verwenden. Wenn Sie diese Zeile eingeben, wird die IDE aufgerufen, um Bereiche zu finden, in denen Sie Vektoren falsch verwenden. Anschließend müssen Sie dasapp:srcCompat
Via-XML verwenden oder es per Code mitVectorDrawableCompat.create()
app:drawableEndCompat
für eine bessere RTL-Unterstützung hinzu? UrsachesetCompoundDrawablesRelativeWithIntrinsicBounds
benötigt mindestens API-Level 17.Diese Lösung ist nicht mehr korrekt. Ab der Version 23.3.0 können Vektor-Drawables nur über die App geladen werden: srcCompat oder setImageResource ()
Versuchen Sie, Ihren Vektor in eine Ebenenliste oder einen Selektor zu packen:
ic_accessible_white_wrapped.xml:
quelle
Der beste Weg, den ich gefunden habe:
quelle
Drawable drawable = VectorDrawableCompat.create(getResources(), status.getIconResId(), wrapper.getTheme()); statusButton.setCompoundDrawablesRelativeWithIntrinsicBounds(null, drawable, null, null);
setCompoundDrawablesWithIntrinsicBounds
ist 17 . Ansonsten funktioniert das super.Um einige der Antworten hier zu ergänzen: Sie können VectorDrawable als
drawableLeft
(usw.) verwenden, dies hängt jedoch von der Version der Support-Bibliothek ab und ist mit einem Preis verbunden.In welchen Fällen funktioniert es? Ich habe dieses Diagramm erstellt , um zu helfen (gültig für Support Library 23.4.0 bis - mindestens - 25.1.0).
quelle
setCompatVectorFromResourcesEnabled
From 23.3.0 version vector drawables can only be loaded via app:srcCompat or setImageResource()
setCompatVectorFromSourcesEnabled(true)
können vectordrawablesandroid:background
unter Android 4.x geladen werden. So danke! (Sie müssen den tatsächlichen Vektor in eine einzelne Element-Layer-ListeKeine der anderen Antworten hat funktioniert. Hier ist, wie ich ein
VectorDrawable
zu einem hinzugefügt habeTextView
, das Sie verwenden sollten,VectorDrawableCompat.create()
wenn Sie sich mitVectorDrawables
unten befassenAndroid L
:Kurz, süß und auf den Punkt!
quelle
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
quelle
Es ist möglich, Vektor-Drawables direkt in XML festzulegen, Sie haben jedoch das Datenbindungs-Framework hinzugefügt.
Einfach schreiben
und wickeln Sie Ihr gesamtes Layout in ein
<layout>
Tag ein, sodass Ihre XML im Grunde so aussehen würde:Um das Datenbindungs-Framework zu aktivieren, fügen Sie einfach hinzu
Sie müssen keine anderen Funktionen der Bindungsbibliothek verwenden
BEARBEITEN:
Wenn Sie Vektor-Drawables vor Lollipop verwenden möchten, müssen Sie natürlich die Unterstützung von Vektor-Drawables mit aktivieren
vectorDrawables.useSupportLibrary = true
Sie
build.gradle
benötigen also 2 neue Befehle:danke an rkmax für die bemerkung
quelle
vectorDrawables.useSupportLibrary
auf app / build.gradle aktivieren und AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) für die Aktivitätbuild.gradle
, das könnte der Grund sein, warum es nicht funktioniertIch habe alle Antworten durchgesehen und mit dem neuesten Android Studio 3.0.1 und der AppCompat Support Library 26.1.0 sichergestellt, dass dies einwandfrei funktioniert.
In der Datei build.gradle (App)
Und in der Aktivitätserweiterung
AppcompatActivity
sind diese externen Methoden enthalten, dh einstatic
Blockoder wenn Sie wollen , dass diese nur auf ganze app angewendet werden , umfassen diese Zeile innerhalb der Klasse erstreckt
Application
KlasseTextansicht in XML
account_drawableleft_selector.xml
quelle
drawableRight
fürTextView
in XML?Ab androidx.appcompat: appcompat: 1.1.0 können Sie verwenden
quelle
Ich bin so spät dran, diese Frage zu beantworten, da ich mich zu spät mit diesem Problem befasst habe. Ich hatte das gleiche Problem mit svg / vector drawables mit TextView. Anstatt Ihre eigenen Zeichen zu erstellen, kann ich mein Problem mit zwei Codezeilen wie folgt beheben:
Hoffe es wird dir helfen.
quelle
L
Geräten.VectorDrawables
allen Geräten, auf denen Pre-L ausgeführt wird. Seien Sie vorsichtig, wenn Sie diese Antwort verwenden, da sicherere und genauere APIs verwendet werden können.Ich habe dafür eine winzige Bibliothek entworfen - textview-rich-drawable (sie unterstützt auch das Definieren der Größe und des Farbtons der zusammengesetzten Drawables).
Und die Abhängigkeit
quelle
Wenn Sie die Bindung verwenden, gibt es eine andere magische Möglichkeit, Vektoren in einer Textansicht auf dieselbe Weise zu verwenden. Wickeln Sie sie wie folgt ein:
Das wird auf magische Weise funktionieren. Ich habe nicht untersucht, was hinter den Kulissen passiert, aber ich denke, dass TextView die
getDrawable
Methode vonAppCompatResources
oder ähnlich verwendet.quelle
Aufgrund der Antwort von Behzad Bahmanyar bemerkte ich, dass ich die normalen Attribute von Android nicht für normale PNG-Dateien verwenden konnte:
weil es durch null in ersetzt würde
wenn das
app:drawableTopCompat
nicht gesetzt war, aberandroid:drawableTop
war (zum Beispiel).Hier ist die vollständige Lösung:
quelle
In der Datei build.gradle (App)
...
Verwenden Sie (beim Datenbinden)
Oder (normal)
quelle
Verwenden von Vector Drawables verwenden
Kotlin
Java
quelle
Verwenden Sie zur Abwärtskompatibilität Folgendes:
quelle
Ich benutze den Bindungsadapter, um dieses Problem zu lösen
und auch auf diese Weise in meinem Layout verwenden
wahrscheinlich ist vectorDrawables.useSupportLibrary = true in der Standardkonfiguration erforderlich
quelle