89 votes

Android vector drawable app:srcCompat n'affiche pas les images

J'utilise la bibliothèque de support pour afficher des images vectorielles sur Android kitkat. Lorsque je teste mon application sur emulater, je ne vois aucune de ces images. J'ai fait une mise en page séparée pour Android lollipop et plus et cela fonctionne parfaitement (je pense que c'est parce que j'utilise la bibliothèque de support pour afficher les images vectorielles). src au lieu de l'attribut srcCompat Voici le code dans lequel j'utilise la bibliothèque de soutien.

<LinearLayout android:layout_alignParentBottom="true"
android:id="@+id/lake_detail"
android:background="@drawable/my_fishing_plan_footer_line"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="90dp"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<RelativeLayout
            android:layout_marginRight="3dp"
            android:id="@+id/fire_logo"
            android:layout_width="20sp"
            android:layout_height="20sp">

            <ImageView
                android:tint="#d74313"
                app:srcCompat="@drawable/circle_icon"
                android:layout_width="30sp"
                android:layout_height="30sp" />

            <ImageView
                android:layout_centerVertical="true"
                android:layout_centerHorizontal="true"
                app:srcCompat="@drawable/lauzaviete"
                android:layout_width="25dp"
                android:layout_height="25dp" />

        </RelativeLayout>

et c'est étrange car je vois les images dans la fenêtre de prévisualisation d'Android studio.

5 votes

Utilice android.support.v7.widget.AppCompatImageView et assurez-vous que vous utilisez la dernière version du support.

1 votes

@Jared Burrows Merci ! Pourriez-vous écrire ceci comme une réponse ? J'aimerais l'accepter !

207voto

Jared Burrows Points 3932

Réponse originale

Utilisez android.support.v7.widget.AppCompatImageView au lieu de ImageView dans votre mise en page, comme ceci :

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

  <android.support.v7.widget.AppCompatImageView
    android:tint="#d74313"
    app:srcCompat="@drawable/circle_icon"
    android:layout_width="30sp"
    android:layout_height="30sp" />

  <android.support.v7.widget.AppCompatImageView
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    app:srcCompat="@drawable/lauzaviete"
    android:layout_width="25dp"
    android:layout_height="25dp" />
</LinearLayout>

Voir le AppCompatImageView docs ici et app:srcCompat ici .

Assurez-vous également de faire ce qui suit :

Configurez votre build.gradle

android {
  defaultConfig {
    vectorDrawables {
      useSupportLibrary = true
    }
  }
}

Docs : https://google.github.io/Android-gradle-dsl/current/com.Android.build.gradle.internal.dsl.VectorDrawablesOptions.html#com.Android.build.gradle.internal.dsl.VectorDrawablesOptions:useSupportLibrary

Étendez votre Activity avec AppCompatActivity

public final class MainActivity extends AppCompatActivity {    
  @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
  }
}

Lorsque vous utilisez app:srcCompat Si vous avez des questions sur les déclarations, assurez-vous d'avoir les déclarations correctes dans votre mise en page :

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

Facultatif (avertissement : veuillez lire la documentation) : setCompatVectorFromResourcesEnabled dans votre Application classe

public class App extends Application {

  @Override public void onCreate() {
    super.onCreate();

    // Make sure we use vector drawables
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
  }
}

Docs : https://developer.Android.com/reference/Android/support/v7/app/AppCompatDelegate.html#setCompatVectorFromResourcesEnabled(booléen)

2 votes

Pourquoi cela ne fonctionne-t-il pas simplement avec ImageView dans supportLibVersion = '25.0.1' ?

0 votes

@toobsco42 : une solution pour supportLibVersion = '25.0.1' ?

0 votes

Mon problème était donc que je n'étendais pas AppCompatActivity. J'étendais Activity, donc je n'utilisais pas le bon LayoutInflater et l'ImageView n'était pas remplacé par un AppCompatImageView automatiquement.

18voto

D-C0d3r Points 186

J'ai eu un problème similaire et après avoir suivi toutes les étapes de La réponse de Jared Burrows le problème n'a pas été résolu.

Il s'avère que l'espace de nom "app" dans mon fichier de mise en page a été défini comme suit :

xmlns:app="http://schemas.android.com/tools"

au lieu de :

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

Après avoir changé cela, le problème a été résolu

1voto

Gouda Elalfy Points 5039

utiliser :

android:background="@drawable/circle_icon"

au lieu de :

app:srcCompat="@drawable/circle_icon"

1 votes

Je peux considérer votre réponse car elle montre l'image, donc merci ! Le problème est que nous ne pouvons pas obtenir le retour d'information lorsque l'utilisateur touche l'image.

1 votes

En fait, il faut l'éviter.

1voto

Isaac Sekamatte Points 968

Mettre en œuvre et app:srcCompact et ensuite vous pouvez l'utiliser sur le ImageView

implementation 'com.android.support:appcompat-v7:28.0.0'

Assurez-vous de mettre en œuvre la bonne version.

Alors dans votre build.gradle set android.defaultConfig.vectorDrawables.useSupportLibrary = true

defaultConfig {

    //...

    vectorDrawables {
        useSupportLibrary true
    }
}

0voto

Fabi755 Points 1048

Assurez-vous également que vos fichiers vectoriels situés dans le répertoire drawable et non dans drawable-anydpi .

Je finis souvent par avoir des problèmes si les graphiques situés dans drawable-anydpi dossier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X