Estou usando drawables vetoriais no Android antes do Lollipop e estes são algumas das minhas bibliotecas e versões de ferramentas:
- Android Studio: 2.0
- Plug-in do Android para Gradle: 2.0.0
- Ferramentas de construção: 23.0.2
- Biblioteca de Suporte Android: 23.3.0
Eu adicionei esta propriedade no meu nível de aplicativo Build.Gradle
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
Também vale a pena mencionar que eu uso um drawable extra, como LayerDrawable (layer_list), conforme declarado no Blog oficial do Android ( link aqui ) para definir drawables para drawables vetoriais fora deapp:srcCompat
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/search"/>
</level-list>
Você encontrará drawables vetoriais que fazem referência direta fora do app: srcCompat falhará antes do Lollipop. No entanto, AppCompat oferece suporte ao carregamento de drawables vetoriais quando eles são referenciados em outro contêiner de drawable, como StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable e RotateDrawable. Usando essa indireção , você pode usar drawables vetoriais em casos como o atributo android: drawableLeft do TextView, que normalmente não seria capaz de suportar drawables vetoriais.
Quando estou usando app:srcCompat
tudo funciona bem, mas quando eu uso:
android:background
android:drawableLeft
android:drawableRight
android:drawableTop
android:drawableBottom
em ImageView
, ImageButton
, TextView
ou EditText
antes do Lollipop, ele lança uma expection:
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9
fonte
Respostas:
ÚLTIMA ATUALIZAÇÃO - Jun / 2019
A Biblioteca de Suporte mudou um pouco desde a resposta original. Agora, até mesmo o plug-in do Android para Gradle é capaz de gerar automaticamente o PNG no momento da construção. Portanto, a seguir estão duas novas abordagens que devem funcionar atualmente. Você pode encontrar mais informações aqui:
Geração PNG
O Gradle pode criar automaticamente imagens PNG de seus ativos no momento da construção. No entanto, nesta abordagem, nem todos os elementos xml são suportados . Esta solução é conveniente porque você não precisa alterar nada em seu código ou em seu build.gradle. Certifique-se de usar o Android Plugin 1.5.0 ou superior e o Android Studio 2.2 ou superior .
Estou usando essa solução no meu aplicativo e funciona bem. Nenhum sinalizador build.gradle adicional necessário. Nenhum hacks é necessário. Se você acessar / build / generated / res / pngs / ... poderá ver todos os PNGs gerados.
Portanto, se você tiver algum ícone simples (uma vez que nem todos os elementos xml são suportados), esta solução pode funcionar para você. Basta atualizar o Android Studio e o plug-in do Android para Gradle.
Biblioteca de Apoio
Provavelmente, esta é a solução que funcionará para você. Se você veio aqui, significa que o Android Studio não está gerando os PNGs automaticamente. Então, seu aplicativo está travando.
Ou talvez você não queira que o Android Studio gere nenhum PNG.
Diferentemente daquela "geração Auto-PNG" que suporta um subconjunto de elementos XML, esta solução suporta todas as tags xml. Portanto, você tem suporte total para seu drawable vetorial.
Você deve primeiro atualizar seu build.gradle para suportá-lo:
E então, use em
app:srcCompat
vez deandroid:src
durante o carregamentoVectorDrawables
. Não se esqueça disso.Pois
TextView
, se você estiver usando aandroidx
versão da Biblioteca de Suporte, você pode usarapp:drawableLeftCompat
(ou direita, parte superior, parte inferior) em vez deapp:drawableLeft
No caso de
CheckBox
/RadioButton
, use emapp:buttonCompat
vez deandroid:button
.Se você não estiver usando a
androidx
versão da Biblioteca de Suporte e suaminSdkVersion
é17
ou superior ou usando um botão, você pode tentar definir programaticamente viaATUALIZAÇÃO - Jul / 2016
Eles reativaram o VectorDrawable na
Android Support Library 23.4.0
Talvez ,
build.gradle
configuração é agora obsoleto e você só precisa habilitá-lo em atividades próprias (no entanto, necessidade de testar).Agora, para habilitá-lo, você deve fazer:
Resposta Original - Abr / 2016
Acho que isso está acontecendo porque o Support Vector foi desativado na última versão da biblioteca: 23.3.0
De acordo com este POST :
Se você visitar o problema ISSUE 205236 , parece que eles serão ativados no futuro, mas o problema de memória não será corrigido em breve:
Eu tive uma questão semelhante. Portanto, no meu caso, reverti todos os ícones que usam drawable vetorial de recursos para imagens PNG novamente (já que o problema de memória continuará acontecendo mesmo depois de fornecerem uma opção para ativá-lo novamente).
Não tenho certeza se esta é a melhor opção, mas corrige todas as falhas na minha opinião.
fonte
vectorDrawables.useSupportLibrary = true
peroperty para voltar a habilitar a geração de PNGs no tempo de compilação novamente?Eu tive o mesmo problema. Mas fazendo muito P&D, obtive a resposta.
Para uso de Imageview e ImageButton,
app:srcCompat="@drawable/...."
e para outras visualizações como Button, Textview, em vez de usar"drawableLeft/right..."
no XML, especifique drawables programaticamente como:E use "AppCompatResources" para obter o drawable.
fonte
Para elaborar outras respostas muito boas , aqui está um diagrama que pode ajudá-lo. É válido se você tiver Biblioteca de Suporte de 23.4.0 a pelo menos 25.1.0.
fonte
A resposta de Guillherme P é incrível. Apenas para fazer uma pequena melhoria, você não precisa adicionar essa linha em todas as atividades, se você a adicionou uma vez na classe Application, ela também funcionará.
LEMBRE-SE: você ainda precisa ter ativado o uso da biblioteca de suporte no gradle:
Além disso, certifique-se de usar uma versão da biblioteca de suporte superior a v23.4, quando o Google adicionou de volta o suporte para Drawable Containers para VectorDrawables ( nota de lançamento )
Atualizar
E para alterações de código:
app:srcCompat
cada local que aceita oandroid:src
atributo (o IDE irá avisá-lo se for inválido como para a<bitmap>
tag).Por
drawableLeft
,drawableStart
,drawableRight
,drawableEnd
atributos usados emTextView
e opiniões semelhantes, você terá que configurá-los por meio de programação para agora. Um exemplo de configuraçãodrawableStart
:fonte
Eu tive o mesmo problema. E conserte removendo
Minha versão alvo é 25 e a biblioteca de suporte é
fonte
vectorDrawables.useSupportLibrary = true
VectorDrawables no pré-pirulito deve funcionar bem sem usar
Se você quiser usar VectorDrawables dentro de ImageViews, você pode usar o atributo
srcCompat
e ele funcionará, mas dentro de Buttons ou TextViews não funcionará , então você precisa envolver o Drawable em um InsetDrawable ou um LayerDrawable. Há outro truque que descobri: se você estiver usando vinculação de dados, poderá fazer isso:Isso funcionará magicamente, não investiguei o que está acontecendo nos bastidores, mas acho que TextView está usando o método getDrawable do AppCompatResources ou similar.
fonte
Muito P&D, finalmente obtendo esta solução para travamentos em dispositivos pré-pirulito.
Para Imageview
Para TextView / EditText
Para Build.gradle
fonte
Maneira mais fácil de usar:
e ... use apenas
app:**Compat
para compatibilidade. Também adicione suporte embuild.gradle
(módulo)fonte
Para quem atualizar para o Android Gradle 3.0 e superior, não há necessidade de usar
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
, ou definirvectorDrawables.useSupportLibrary = true
(adicionar isso causará problema) e usarapp:srcCompat
, ele simplesmente funciona.Levei dois dias para descobrir isso e não encontrei nenhum documento relacionado nos documentos do Google ...
fonte
Estou usando VectorDrawables em dispositivos pré-pirulito e é assim que faço: -
Etapa 1: coloque isso em seu gradle de nível de aplicativo.
Passo 2:
Coloque isso em sua classe Application e não se esqueça de registrar sua classe Application no arquivo de manifesto.
Etapa 3:
Obtenha o VectorDrawables usando,
fonte
Depois de usar o código abaixo.
ainda assim, existe um problema de imagens vetoriais para os atributos abaixo
DrawableEnd, DrawableStart, DrawableTop, DrawableBottom, Background
Nesse caso, siga as instruções abaixo. Em vez de fazer referência à imagem vetorial diretamente, use a marca do seletor como um arquivo drawable intermediário.
Exemplo:
ic_warranty_icon.xml
safe_ic_warranty_icon.xml
Seu TextView / Layout.
fonte
selector
Nós tentamos 3 coisas
Configurando setCompatVectorFromResourcesEnabled na classe Application
E use
app:srcCompat
Mas mesmo depois disso, estava falhando com
então descobrimos que nosso SVG tinha uma tag Gradient. Converter a tag gradiente em caminhos individuais para a API inferior <= 23 e usar a mesma API SVG> = 24 funcionou.
Obteve ajuda com esta resposta https://stackoverflow.com/a/47783962/2171513
fonte
Simplesmente sobreponha o drawable vetorial à lista de estados, então o problema será resolvido
Por exemplo, você tem uma imagem vetorial de seta para trás:
sim, você deve sobrepô-lo à lista de camadas xml (ic_back_arrow_vector_vector.xml):
Porque a lógica:
e
não irá ajudá-lo em alguns dispositivos da China e dispositivos Samsung mais antigos. Se você não os sobrepuser, ele falhará.
fonte
Eu estava lutando com isso por horas.
Tentei tudo o que essas respostas me disseram, mas meu aplicativo não parou de travar. Excluí esta linha:
app:srcCompat="@drawable/keyboard"
e meu aplicativo parou de travar. e então, quando adicionei a mesma coisa de volta, ele começou a travar novamente. Decidi abrir esse arquivo e vi um erro na primeira linha dizendoCliquei com o botão direito no arquivo e cliquei em "Mostrar no explorer" e não estava na pasta drawable, mas no diretório drawable-v24. Então eu copiei e colei no diretório drawable e finalmente me livrei das falhas.
fonte
A sugestão do Guilherme P não estava funcionando para mim. Fui em frente e tomei a decisão de usar png onde preciso fazer coisas fora do app: srcCompat, ou seja, drawableLeft, drawableRight, etc. Essa foi uma alteração muito fácil de fazer e não tem os possíveis problemas de memória AppCompatDelegate.setCompatVectorFromResourcesEnabled ( verdade); apresenta.
fonte
Uma alternativa para a resposta de Benny é criar uma
Activity
superclasse:Agora estenda em
VectorDrawableActivity
vez deAppCompatActivity
.fonte