Diferença entre app: srcCompat e android: src no XML do layout do Android

138

Sempre que crio um ImageView com o ícone adicionado usando os Ativos de vetor do Android Studio, recebo um erro na linha app:srcCompat="@drawable/ic_play"

Quando altero o app:srcCompatcom android:src, o erro desaparece, mas o ícone parece pixelizado.

Qual é a principal diferença entre

app:srcCompat="@drawable/ic_play"

e

android:src="@drawable/ic_play"
Zayid Mohammed
fonte

Respostas:

139

app: srcCompat

é o método mais seguro de integrar gavetas vetoriais em seu aplicativo. Gavetas vetoriais permitem substituir vários ativos png por um único gráfico vetorial, definido em XML. Embora anteriormente limitado a Lollipop e dispositivos superiores

Nota

A partir da Biblioteca de suporte Android 23.3.0 , os drawables de vetores de suporte podem ser carregados apenas via app:srcCompat.

você precisa adicionar vectorDrawables.useSupportLibrary = true ao seu build.gradlearquivo

    // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }  

android: src

Define um drawable como o conteúdo deste ImageView. Ele será exibido em seu tamanho original. Sem escala automática.

IntelliJ Amiya
fonte
2
o erro com o aplicativo: srcCompact desapareceu quando adicionado vectorDrawables.useSupportLibrary = true no módulo de aplicativo Gradle
Zayid Mohammed 16/16
3
O aplicativo: srcCompat entra em conflito com as versões mais antigas do Android? Mais especificamente, Api 19 é a versão mais antiga a que me refiro.
Equivocal
Wow pode finalmente se livrar dos ícones de bitmap.
Meow Cat 2012
O link do post do Google Plus está morto agora
Vadim Kotov
Eu adicionei acima a build.gradle, mas ainda não está funcionando, alguma idéia?
David Callanan
20

Se você estiver usando o arquivo build.gradle android:src="@drawable/some_vector"sem vectorDrawables.useSupportLibrary = trueo aplicativo e tiver imagens vetoriais (drawable vector), ao criar o arquivo apk, o plug-in Android gradle gera muitos arquivos * .png para diferentes telas (hdpi, xhdpi ...) cada um dos seus vetores desenhados (apenas para API = <19). O resultado - tamanho maior do apk .

Ao usar app:srcCompat="@drawable/some_vector"com o vectorDrawables.useSupportLibrary = trueAndroid, é possível usar arquivos desenhados por vetores sem gerar *.pngarquivos.

Você pode verificar isso com a ferramenta analisador de apk do Android Studio. Basta criar apk com e sem vectorDrawables.useSupportLibrary = true.

Eu acho que essa é a principal diferença.

bitvale
fonte
Portanto, se você tiver useSupportLibrary definido como true, por que você precisa da sintaxe especial, e não do android: src =? Se você usa android: src = com o useSupportLibrary ativado, evita a proliferação de PNGs?
Oscar
9

Usar:

app:srcCompat="@drawable/backImage"

O atributo srcCompat é realmente definido na biblioteca AppCompat. Importante: você precisará adicionar o espaço para nome apropriado para isso.

xmlns:app="http://schemas.android.com/apk/res-auto"

Nota

O que você está recebendo parece ser apenas um erro de cotão que pode ser ignorado. Eu tentei e obtive o mesmo erro, mas está funcionando corretamente.

Você pode usar tools:ignore="MissingPrefix"para evitar temporariamente esse erro.

Eu espero que isso ajude.

Chandrahasan
fonte
5

Ao usar AppCompatcom ImageView(ou subclasses como ImageButtone FloatingActionButton), você poderá usar o novo app:srcCompatatributo para referenciar drawables vetoriais em versões mais antigas da plataforma (assim como qualquer outro drawable disponível para android:src) .

android.support.v7.appcompat.R.attr.srcCompat :

srcCompat

Define um drawable como o conteúdo deste ImageView. Permite o uso de vetores desenháveis ​​ao executar em versões mais antigas da plataforma.

Pode ser uma referência para outro recurso, no formulário "@[+][package:]type/name"ou um atributo de tema no formulário "?[package:]type/name".


Não se esqueça de adicionar xmlns:app="http://schemas.android.com/apk/res-auto"quando usar app:srcCompat.

Mir-Ismaili
fonte
4

Vetores e vetores animados eram suportados apenas em versões recentes da estrutura. srcCompat pode ser usado com a biblioteca de compatibilidade para fazê-los funcionar, mas isso funciona apenas com determinadas visualizações na biblioteca de suporte. Observe que o aplicativo: é usado em vez do android :. Isso significa que não faz parte da estrutura, mas um parâmetro definido pelo seu aplicativo.

Gabe Sechan
fonte
3
app:srcCompat="some_resource" 

referir que é AppCompatActivity src que vem na biblioteca de suporte enquanto

android:src="some_resource"

refere-se a atividade simples.

Najeeb Idrees
fonte
3

Ao usar AppCompatcom ImageView(ou subclasses como ImageButtone FloatingActionButton), você poderá usar o novo app:srcCompatatributo para fazer referência a drawables vetoriais (assim como qualquer outro drawable disponível para android:src). E se você estiver alterando drawables em tempo de execução, poderá usar o mesmo setImageResource()método de antes (não há alterações).

Usar AppCompate app:srcCompaté o método mais infalível de integrar desenháveis ​​vetoriais em seu aplicativo. Você verá que a referência direta a drawables vetoriais fora de app:srcCompatfalhará antes do Lollipop .

Muhammad Younas
fonte
1

O Android 5.0 (nível de API 21) e superior fornece suporte para desenho vetorial, portanto, para oferecer suporte ao desenho vetorial em versões mais antigas: srcCompat foi adicionado

SaravInfern
fonte