Kiedy używam zasobów VectorDrawable w widoku tekstowym lub widoku obrazu, podczas korzystania z funkcji „android: DrawableRight” / „android: DrawableEnd” / „android: DrawableStart” / „android: DrawableLeft” występuje awaria środowiska wykonawczego.
Aplikacja skompiluje się bez żadnych ostrzeżeń.
ja używam
- Gradle 1.5
- Obsługa biblioteki 23.2 ('com.android.support:appcompat-v7:23.2.0')
Odkryłem jednak, że mogę programowo przypisać pliki SVG w Javie bez takich awarii.
TextView tv = (TextView) findViewById(R.id.textView);
tv.setCompoundDrawablesWithIntrinsicBounds(null,null, getResources().getDrawable(R.drawable.ic_accessible_white_36px),null);
(Podejrzewam, że jest to błąd biblioteki obsługi wersji 23.2.)
Ale czy można użyć drawableRight itp. Do zasobów SVG?
Oto mój układ
<?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>
Oto moja aktywność
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);
}
}
Oto niezmodyfikowany zasób VectorDrawable z witryny Google Material Design.
<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>
Oto moja aplikacja 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'
}
Oto katastrofa. (Zwróć uwagę na błędy inflacji, które odnoszą się do widoku tekstowego).
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)
...
Odpowiedzi:
tak
AppCompatTextView się wsporniki
app:drawableLeftCompat
,app:drawableTopCompat
,app:drawableRightCompat
,app:drawableBottomCompat
,app:drawableStartCompat
iapp:drawableEndCompat
kanału alfa związek, wspierając przeniesione rozciągliwej typów, takich jakVectorDrawableCompat
.Uwzględnij to w swoim pliku gradle
W widoku tekstu możesz użyć
Jeśli masz problemy podczas korzystania z app: drawableLeftCompat, app: drawableStartCompat w przyciskach, musisz zaktualizować swoją bibliotekę do
androidx.appcompat: appcompat: 1.2.0-alpha01
mieli włączony błąd
androidx.appcompat: appcompat: 1.1.0-alpha01
możesz zobaczyć dokumenty
A jeśli nie chcesz jeszcze aktualizować, to:
Ponieważ wydaje się, że Google w najbliższym czasie nie zrobi nic w tej sprawie, musiałem wymyślić solidniejsze rozwiązanie wielokrotnego użytku dla wszystkich moich aplikacji:
Pierwszy dodatek zwyczaj TextView atrybutów pliku w attrs.xml swojej aplikacji „RES / wartości / attrs.xml” :
Następnie utwórz niestandardową klasę TextView w następujący sposób:
Teraz możesz go łatwo używać w dowolnych układach według własnych atrybutów:
Mam nadzieję że to pomoże :)
źródło
vectorDrawables { useSupportLibrary = true }
z mojego,build.gradle
jak sugeruje ta odpowiedź, zadziałało dla mnie.vectorDrawables useSupportLibrary = true
linii z gradle. Po usunięciu możesz nadal umieszczać wektory w swoich widokach, ale zmieniają one rozmiar w taki sam sposób, jak pliki png, co oznacza, że zostaną rozciągnięte i staną się ziarniste. Jeśli chcesz, aby urządzenia poniżej 5.0 / API21 faktycznie zmieniały rozmiar wektorów, aby wyglądały ostro, musisz użyć tej linii w pliku gradle. Wstawienie tej linii wywołuje IDE, aby znaleźć obszary, w których nieprawidłowo używasz wektorów, a następnie musisz użyćapp:srcCompat
przez XML lub ustawić go za pomocą kodu za pomocąVectorDrawableCompat.create()
app:drawableEndCompat
uzyskać lepszą obsługę RTL? PrzyczynasetCompoundDrawablesRelativeWithIntrinsicBounds
wymaga co najmniej poziomu API 17.To rozwiązanie nie jest już poprawne. Od wersji 23.3.0 elementy wektorowe można ładować tylko za pośrednictwem aplikacji: srcCompat lub setImageResource ()
Spróbuj zawinąć swój wektor, który można rysować, w listę warstw lub selektor:
ic_accessible_white_wrapped.xml:
źródło
Najlepszy sposób, jaki znalazłem:
źródło
Drawable drawable = VectorDrawableCompat.create(getResources(), status.getIconResId(), wrapper.getTheme()); statusButton.setCompoundDrawablesRelativeWithIntrinsicBounds(null, drawable, null, null);
setCompoundDrawablesWithIntrinsicBounds
to 17 . W przeciwnym razie działa to świetnie.Aby uzupełnić niektóre odpowiedzi tutaj: możesz sprawić, by VectorDrawable działał jako
drawableLeft
(itp.), Ale zależy to od wersji Biblioteki Wsparcia i ma swoją cenę.W jakich przypadkach to działa? Zrobiłem ten diagram jako pomoc (ważny dla Support Library 23.4.0 do - przynajmniej - 25.1.0).
źródło
setCompatVectorFromResourcesEnabled
From 23.3.0 version vector drawables can only be loaded via app:srcCompat or setImageResource()
więc to rozwiązanie jest przestarzałe i nie będzie działaćsetCompatVectorFromSourcesEnabled(true)
umożliwia ładowanie vectordrawables wandroid:background
systemie Android 4.x. Więc dziękuję! (Musisz owinąć rzeczywisty wektor w listę warstw pojedynczego elementu)Żadna z pozostałych odpowiedzi nie zadziałała, oto jak dodałem a
VectorDrawable
do aTextView
, powinieneś użyć,VectorDrawableCompat.create()
gdy masz do czynienia zVectorDrawables
poniżejAndroid L
:Krótko, słodko i na temat!
źródło
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
źródło
Możliwe jest bezpośrednie ustawianie rysunków wektorowych w formacie XML, ale musisz uwzględnić strukturę powiązań danych.
Tylko napisz
i zawiń cały układ w
<layout>
tag, więc zasadniczo Twój xml wyglądałby tak:Aby aktywować strukturę powiązań danych, po prostu dodaj
Nie musisz używać żadnych innych funkcji biblioteki powiązań
EDYTOWAĆ:
Oczywiście, jeśli chcesz używać rysunków wektorowych przed Lollipopem, musisz włączyć rysunki wektorowe pomocnicze za pomocą
vectorDrawables.useSupportLibrary = true
Więc twoje
build.gradle
potrzeby 2 nowych poleceń:dzięki rkmax za uwagę
źródło
vectorDrawables.useSupportLibrary
na app / build.gradle, a także dodać AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) w aktywnościbuild.gradle
że może to być powód, dla którego nie działaPrzeszedłem przez wszystkie odpowiedzi i korzystając z najnowszego Android Studio 3.0.1 i biblioteki obsługi AppCompat 26.1.0, zapewniam, że to działa dobrze.
W pliku build.gradle (aplikacja)
I w rozszerzaniu działalności
AppcompatActivity
uwzględnij to zewnętrzne metody, tj.static
Bloklub jeśli chcesz, aby zostało to zastosowane do całej aplikacji, po prostu umieść tę linię w rozszerzeniu klasy
Application
klasęTextview w formacie xml
account_drawableleft_selector.xml
źródło
drawableRight
zTextView
XML?Od androidx.appcompat: appcompat: 1.1.0 możesz użyć
źródło
Jestem tak późno, aby odpowiedzieć na to pytanie, ponieważ utknąłem późno z tym problemem. Miałem ten sam problem z rysunkami SVG / Vector z TextView. Zamiast tworzyć własne niestandardowe rysunki, jestem w stanie naprawić mój problem za pomocą 2 linii kodu, jak poniżej:
Mam nadzieję, że to ci pomoże.
źródło
L
urządzeniami.VectorDrawables
na wszystkich urządzeniach z systemem pre-L, po prostu powiedz. Zachowaj ostrożność podczas korzystania z tej odpowiedzi, ponieważ istnieją bezpieczniejsze, dokładniejsze interfejsy API.Zaprojektowałem do tego małą bibliotekę - bogatą w tekst, z możliwością rysowania (obsługuje również definiowanie rozmiaru i zabarwienia elementów składowych do rysowania).
I zależność
źródło
Jeśli używasz wiązania, istnieje inny magiczny sposób, aby mieć to samo podejście do używania wektorów w TextView. Zawijając je jak:
To magicznie zadziała, nie badałem, co dzieje się za kulisami, ale myślę, że TextView używa
getDrawable
metody zAppCompatResources
lub podobnej.źródło
Na podstawie BEHZAD Bahmanyar za odpowiedź , zauważyłem, że nie mogę użyć android normalne atrybuty dla zwykłych plików PNG:
ponieważ zostałby zastąpiony przez null in
jeśli
app:drawableTopCompat
nie został ustawiony, aleandroid:drawableTop
został (np.).Oto pełne rozwiązanie:
źródło
W pliku build.gradle (aplikacja)
...
użyj (podczas wiązania danych)
Lub (normalny)
źródło
Za pomocą Vector Drawables użyj
kotlin
Jawa
źródło
Aby zapewnić zgodność z poprzednimi wersjami, użyj:
źródło
Używam Binding adaptera do rozwiązania tego problemu
a także używając w ten sposób w moim układzie
prawdopodobnie vectorDrawables.useSupportLibrary = true w domyślnej konfiguracji jest konieczne
źródło