Quando uso os recursos do VectorDrawable em uma exibição de texto ou imagem, recebo uma falha de tempo de execução ao usar "android: DrawableRight" / "android: DrawableEnd" / "android: DrawableStart" / "android: DrawableLeft".
O aplicativo será compilado sem nenhum aviso.
estou usando
- Gradle 1.5
- Biblioteca de suporte 23.2 ('com.android.support:appcompat-v7:23.2.0')
O que eu descobri é que posso atribuir SVG programaticamente em Java sem falhas como essa.
TextView tv = (TextView) findViewById(R.id.textView);
tv.setCompoundDrawablesWithIntrinsicBounds(null,null, getResources().getDrawable(R.drawable.ic_accessible_white_36px),null);
(Suspeito que este seja um bug da biblioteca de suporte para 23.2.)
Mas é possível usar drawableRight etc para ativos SVG?
Aqui está o meu 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>
Aqui está a minha atividade
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);
}
}
Aqui está o ativo VectorDrawable não modificado do site de design de materiais do 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>
Aqui está o meu aplicativo 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'
}
Aqui está o acidente. (Observe os erros inflacionados que referenciam a exibição de texto.)
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)
...
Respostas:
sim
AppCompatTextView agora suportes
app:drawableLeftCompat
,app:drawableTopCompat
,app:drawableRightCompat
,app:drawableBottomCompat
,app:drawableStartCompat
eapp:drawableEndCompat
drawables compostos, apoiando backported tipos resgatáveis, tais comoVectorDrawableCompat
.Inclua isso no seu arquivo gradle
Na sua exibição de texto, você pode usar
Se você tiver problemas ao usar os botões app: drawableLeftCompat, app: drawableStartCompat, precisará atualizar sua biblioteca para
androidx.appcompat: appcompat: 1.2.0-alpha01
eles tinham um bug
androidx.appcompat: appcompat: 1.1.0-alpha01
você pode ver os documentos
Ou se você não deseja atualizar ainda, então:
Como parece que o Google não fará nada sobre esse problema tão cedo, tive que encontrar uma solução reutilizável mais sólida para todos os meus aplicativos:
Primeiro, adicione atributos personalizados do TextView no arquivo attrs.xml do seu aplicativo "res / values / attrs.xml" :
Em seguida, crie uma classe TextView personalizada como esta:
Agora você pode usá-lo facilmente em qualquer layout usando seus atributos personalizados:
Espero que isto ajude :)
fonte
vectorDrawables { useSupportLibrary = true }
do meubuild.gradle
como essa resposta sugere funcionou para mim.vectorDrawables useSupportLibrary = true
linha do gradle. Ao removê-lo, você ainda pode colocar vetores nas suas visualizações, mas eles são redimensionados da mesma forma que os pngs, o que significa que serão esticados e granulados. Se você deseja que os dispositivos abaixo de 5.0 / API21 redimensionem os vetores corretamente para que fiquem nítidos, use essa linha dentro do arquivo gradle. Colocar essa linha no invoca o IDE para encontrar áreas onde você está usando vetores incorretamente e, em seguida, você deve usar aapp:srcCompat
via XML ou defini-lo por meio de código comVectorDrawableCompat.create()
app:drawableEndCompat
para melhor suporte a RTL? A causasetCompoundDrawablesRelativeWithIntrinsicBounds
precisa do nível 17 da API pelo menos.Esta solução não está mais correta. A partir da versão 23.3.0, os drawables vetoriais da versão só podem ser carregados via app: srcCompat ou setImageResource ()
Tente agrupar seu desenho vetorial na lista de camadas ou no seletor:
ic_accessible_white_wrapped.xml:
fonte
A melhor maneira que encontrei:
fonte
Drawable drawable = VectorDrawableCompat.create(getResources(), status.getIconResId(), wrapper.getTheme()); statusButton.setCompoundDrawablesRelativeWithIntrinsicBounds(null, drawable, null, null);
setCompoundDrawablesWithIntrinsicBounds
é 17 . Caso contrário, isso funciona muito bem.Para complementar algumas das respostas aqui: você pode fazer com que o VectorDrawable funcione como
drawableLeft
(etc.), mas isso depende da versão da Biblioteca de suporte e tem um preço.Em quais casos isso funciona? Fiz este diagrama para ajudar (válido para a Biblioteca de suporte 23.4.0 a - pelo menos - 25.1.0).
fonte
setCompatVectorFromResourcesEnabled
From 23.3.0 version vector drawables can only be loaded via app:srcCompat or setImageResource()
por isso esta solução é obsoleto e não vai funcionarsetCompatVectorFromSourcesEnabled(true)
permite carregar vectordrawables noandroid:background
Android 4.x. Então obrigado! (Você precisa agrupar o vetor real em uma única lista de camadas de itens)Nenhuma das outras respostas funcionou. Aqui está como adicionei
VectorDrawable
a aTextView
, você deve usarVectorDrawableCompat.create()
ao lidar comVectorDrawables
abaixoAndroid L
:Curto, doce e direto ao ponto!
fonte
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
fonte
É possível definir diretamente drawables vetoriais em xml, mas você incluiu a estrutura de ligação de dados.
Apenas escreva
e envolva todo o layout em uma
<layout>
tag, para que basicamente seu xml se pareça com:Para ativar a estrutura de ligação de dados, basta adicionar
Você não precisa usar outros recursos da biblioteca de ligação
EDITAR:
Obviamente, se você quiser usar gavetas vetoriais pré-pirulito, precisará ativar gavetas vetoriais de suporte usando
vectorDrawables.useSupportLibrary = true
Então, você
build.gradle
precisa de 2 novos comandos:graças a rkmax pela observação
fonte
vectorDrawables.useSupportLibrary
em app / build.gradle e também adicionar AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) sobre a atividadebuild.gradle
que pode ser a razão pela qual ele não está funcionandoAnalisei todas as respostas e, usando o mais recente Android studio 3.0.1 e a AppCompat Support Library 26.1.0, posso garantir que isso funcione bem.
No arquivo build.gradle (app)
E em Activity extending,
AppcompatActivity
inclua esses métodos externos, ou seja, umstatic
blocoou se você quiser que isso seja aplicado a todo o aplicativo, inclua essa linha na classe que estende a
Application
classeTextview em xml
account_drawableleft_selector.xml
fonte
drawableRight
paraTextView
em XML?No androidx.appcompat: appcompat: 1.1.0 você pode usar
fonte
Estou tão atrasado para responder a essa pergunta quanto me atrapalhei com esse problema. Eu tive o mesmo problema com drawables svg / vector com TextView. Em vez de criar seu próprio desenho personalizado, sou capaz de corrigir meu problema com duas linhas de código, como abaixo:
Espero que ajude você.
fonte
L
dispositivos.VectorDrawables
todos os dispositivos executando pré-L, apenas dizendo. Seja cauteloso ao usar esta resposta, pois há APIs mais seguras e precisas para usar.Eu projetei uma pequena biblioteca para isso - textview-rich-drawable (também suporta a definição do tamanho e matiz dos drawables compostos).
E a dependência
fonte
Se você estiver usando a ligação, há outra maneira mágica de ter a mesma abordagem para usar vetores em um TextView. Envolvendo-os como:
Isso funcionará magicamente, não investiguei o que está acontecendo nos bastidores, mas acho que o TextView está usando o
getDrawable
método doAppCompatResources
ou similar.fonte
Com base na resposta de Behzad Bahmanyar , notei que não podia usar os atributos normais do android para arquivos png normais:
porque seria substituído por nulo em
se o
app:drawableTopCompat
não foi definido, masandroid:drawableTop
foi (por exemplo).Aqui está a solução completa:
fonte
No arquivo build.gradle (app)
...
use (Ao vincular dados)
Ou (Normal)
fonte
Usando Drawables vetoriais
kotlin
Java
fonte
Para compatibilidade com versões anteriores, use:
fonte
Estou usando o adaptador de ligação para resolver este problema
e também usando dessa maneira no meu layout
provavelmente vectorDrawables.useSupportLibrary = true na configuração padrão é necessária
fonte