2 votes

La balise <gradient> dans le XML fait planter Android

J'ai une icône qui a un composant de gradient.

<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
        android:width="100dp"
        android:height="100dp"
        android:viewportWidth="100.0"
        android:viewportHeight="100.0">
    <path
        android:pathData="M68.13,36.74L68.13,36C68.13,30.48 63.65,26 58.13,26L58.13,26L25,26L25,26C19.48,26 15,30.48 15,36L15,36L15,64C15,69.52 19.48,74 25,74L58.13,74C63.65,74 68.13,69.52 68.13,64L68.13,64L68.13,60.74L77.17,69.79L77.17,69.79C77.92,70.54 78.94,70.96 80,70.96C82.21,70.96 84,69.17 84,66.96L84,30.52C84,29.46 83.58,28.44 82.83,27.69C81.27,26.13 78.74,26.13 77.17,27.69L68.13,36.74Z"
        android:strokeColor="#00000000"
        android:fillType="evenOdd"
        android:strokeWidth="1">
        <aapt:attr name="android:fillColor">
<gradient

        android:startY="60.028559008"
        android:startX="41.416262106"
        android:endY="100.0"
        android:endX="81.32660406299999"
        android:type="linear">
<item android:offset="0.0" android:color="#FFFA8561" />
<item android:offset="1.0" android:color="#FFFC5D5D" />
            </gradient></aapt:attr></path>
    <path
        android:pathData="M53.93,51.56C53.57,47.09 51.34,44.29 49.38,41.81C47.57,39.52 46,37.54 46,34.63C46,34.39 45.86,34.18 45.64,34.07C45.42,33.96 45.15,33.98 44.95,34.12C42,36.09 39.54,39.42 38.69,42.6C38.09,44.81 38.01,47.29 38,48.94C35.28,48.39 34.67,44.58 34.66,44.54C34.63,44.34 34.5,44.17 34.31,44.07C34.12,43.98 33.9,43.97 33.71,44.06C33.57,44.13 30.21,45.73 30.01,52.11C30,52.32 30,52.54 30,52.75C30,58.95 35.38,64 42,64C48.64,63.98 54,58.94 54,52.75C54,52.44 53.93,51.56 53.93,51.56Z"
        android:strokeColor="#00000000"
        android:fillType="nonZero"
        android:fillColor="#FFFFFF"
        android:strokeWidth="1"/>
</vector>

J'essaie d'utiliser ce XML comme icône dans mon application.

Cependant, pour une raison quelconque, quand je fais

<ImageView src="@drawable/icon"/>

Avec l'API 23, mon application se plante immédiatement.

Cependant, au niveau 19 de l'API, la même application fonctionne sans aucun problème.

Si j'enlève ça <gradient> l'API 23 fonctionne bien aussi.

Que dois-je faire pour que l'application fonctionne sans problème dans l'API 23 ?

2voto

MatPag Points 12624

Le principal problème ici est que vous essayez d'utiliser le gradient et les propriétés définies pour l'API 24 telles que android:fillType et android:startY dans un appareil avec l'API 19.

La solution est la suivante :

Créer 2 dossiers de dessinateurs

  • drawable
  • drawable-v24

Mettez cela comme your_logo.xml dans le drawable (j'ai utilisé #FFFA8561 pris sur le gradient)

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="100dp"
    android:height="100dp"
    android:viewportWidth="100.0"
    android:viewportHeight="100.0">
    <path
        android:pathData="M68.13,36.74L68.13,36C68.13,30.48 63.65,26 58.13,26L58.13,26L25,26L25,26C19.48,26 15,30.48 15,36L15,36L15,64C15,69.52 19.48,74 25,74L58.13,74C63.65,74 68.13,69.52 68.13,64L68.13,64L68.13,60.74L77.17,69.79L77.17,69.79C77.92,70.54 78.94,70.96 80,70.96C82.21,70.96 84,69.17 84,66.96L84,30.52C84,29.46 83.58,28.44 82.83,27.69C81.27,26.13 78.74,26.13 77.17,27.69L68.13,36.74Z"
        android:strokeColor="#00000000"
        android:fillColor="#FFFA8561"
        android:strokeWidth="1">
    </path>
    <path
        android:pathData="M53.93,51.56C53.57,47.09 51.34,44.29 49.38,41.81C47.57,39.52 46,37.54 46,34.63C46,34.39 45.86,34.18 45.64,34.07C45.42,33.96 45.15,33.98 44.95,34.12C42,36.09 39.54,39.42 38.69,42.6C38.09,44.81 38.01,47.29 38,48.94C35.28,48.39 34.67,44.58 34.66,44.54C34.63,44.34 34.5,44.17 34.31,44.07C34.12,43.98 33.9,43.97 33.71,44.06C33.57,44.13 30.21,45.73 30.01,52.11C30,52.32 30,52.54 30,52.75C30,58.95 35.38,64 42,64C48.64,63.98 54,58.94 54,52.75C54,52.44 53.93,51.56 53.93,51.56Z"
        android:strokeColor="#00000000"
        android:fillColor="#FFFFFF"
        android:strokeWidth="1"/>
</vector>

Créez cette gradient_logo.xml et le mettre sur le drawable-v24 (ne vous inquiétez pas si Android Studio se plaint de ce fichier, il compilera bien même s'il est marqué en rouge).

<?xml version="1.0" encoding="utf-8"?>
<gradient xmlns:android="http://schemas.android.com/apk/res/android"
    android:startY="60.028559008"
    android:startX="41.416262106"
    android:endY="100.0"
    android:endX="81.32660406299999"
    android:startColor="#FFFA8561"
    android:endColor="#FFFC5D5D"
    android:type="linear" />

Mettez cette version différente de your_logo.xml dans le drawable-v24 dossier

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="100dp"
    android:height="100dp"
    android:viewportWidth="100.0"
    android:viewportHeight="100.0">
    <path
        android:pathData="M68.13,36.74L68.13,36C68.13,30.48 63.65,26 58.13,26L58.13,26L25,26L25,26C19.48,26 15,30.48 15,36L15,36L15,64C15,69.52 19.48,74 25,74L58.13,74C63.65,74 68.13,69.52 68.13,64L68.13,64L68.13,60.74L77.17,69.79L77.17,69.79C77.92,70.54 78.94,70.96 80,70.96C82.21,70.96 84,69.17 84,66.96L84,30.52C84,29.46 83.58,28.44 82.83,27.69C81.27,26.13 78.74,26.13 77.17,27.69L68.13,36.74Z"
        android:strokeColor="#00000000"
        android:fillType="evenOdd"
        android:fillColor="@drawable/gradient_logo"
        android:strokeWidth="1">
    </path>
    <path
        android:pathData="M53.93,51.56C53.57,47.09 51.34,44.29 49.38,41.81C47.57,39.52 46,37.54 46,34.63C46,34.39 45.86,34.18 45.64,34.07C45.42,33.96 45.15,33.98 44.95,34.12C42,36.09 39.54,39.42 38.69,42.6C38.09,44.81 38.01,47.29 38,48.94C35.28,48.39 34.67,44.58 34.66,44.54C34.63,44.34 34.5,44.17 34.31,44.07C34.12,43.98 33.9,43.97 33.71,44.06C33.57,44.13 30.21,45.73 30.01,52.11C30,52.32 30,52.54 30,52.75C30,58.95 35.38,64 42,64C48.64,63.98 54,58.94 54,52.75C54,52.44 53.93,51.56 53.93,51.56Z"
        android:strokeColor="#00000000"
        android:fillType="nonZero"
        android:fillColor="#FFFFFF"
        android:strokeWidth="1"/>
</vector>

Utilisez le AppCompatImageView pour ajouter l'image

<android.support.v7.widget.AppCompatImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/your_logo"/>

Conclusions : De cette façon, votre projet sera bien compilé, mais vous remarquerez que vous vous retrouverez avec 2 logos légèrement différents, un pour API >= 24 et un autre pour API <=23.

enter image description here

Je ne sais pas si cela est acceptable pour vous, mais si vous tenez à ce que votre logo ne soit pas exactement le même sur toutes les plateformes, les solutions disponibles sont celles-là :

  1. N'utilisez pas de vecteurs pour votre logo. Utilisez le jeu classique de PNG distribué dans le mipmap les dossiers.
  2. N'utilisez pas de gradient dans votre logo et optez pour la version plate qui est compatible avec l'API >=19

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