web-dev-qa-db-fra.com

Comment supprimer l'avertissement de Lint spécifique pour la fonction Android dépréciée?

J'utilise un commutateur de version pour prendre en charge les anciennes versions d'Android.

int sdk = Build.VERSION.SDK_INT;
if (sdk < Build.VERSION_CODES.HONEYCOMB) {
    ColorDrawable colorDrawable = new ColorDrawable(shapeColor);
    //noinspection deprecation
    viewHolder.shape.setBackgroundDrawable(colorDrawable);
} else {
    viewHolder.shape.setColor(shapeColor);
}

Lorsque vous générez le projet avec Gradle à partir de la ligne de commande, l'avertissement suivant est généré par Lint:

app/src/main/Java/com/example/MyApp/CustomListAdapter.Java:92: warning: 
[deprecation] setBackgroundDrawable(Drawable) in View has been deprecated
            viewHolder.shape.setBackgroundDrawable(colorDrawable);
                            ^

Puis-je annoter la ligne ou la méthode spécifique pour mettre l'avertissement en sourdine (puisque je le fais exprès)? Je fais pas veux désactiver tout avertissements.

11
JJD

Juste quelque chose de nouveau: vous n'êtes pas sûr d'Android Studio, mais, pour supprimer cet avertissement de cette ligne, vous pouvez utiliser:

//noinspection deprecation

Cela supprime l’avertissement de la ligne suivante. E.g:

//noinspection deprecation
e.setBackgroundDrawable(editTextDrawable);

Il n'y aura pas d'erreur. Cependant, comme @JJD l'a dit, cela envoie toujours l'avertissement à la console. Mais au moins vous pouvez avoir un code Nice sans erreur qui peut être utile comme pour Git par exemple. Et cela évite le problème avec @SupressWarnings, qui ignore tous les avertissements de la méthode. Donc, si vous avez quelque chose de désapprouvé dont vous n'êtes pas au courant, @SupressWarnings le cachera et vous ne serez pas averti. C'est l'avantage du //noinspection

8
Ab_

J'ai rencontré un problème similaire. J'ai d'abord un avertissement du compilateur:

:compileDebugJava
Note: /path/file.Java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

Ce que vous pouvez supprimer avec @SuppressWarnings("deprecation") ou simplement ignorer car il s’agit d’un avertissement et fait échouer votre construction. De plus, j’ai eu l’erreur de peluchage (détails dans build/lint-results.html):

Call requires API level 13 (current min is 9)

Cela pourrait être supprimé en ajoutant @SuppressLint("NewApi"). Vous pouvez également utiliser @TargetApi(13) pour indiquer que la méthode/classe peut utiliser des méthodes dépendant de l'API version 13, plutôt que celles que vous avez définies en tant que minSdkVersion (par exemple 9).

Les annotations ne peuvent être effectuées qu'au niveau d'une classe ou d'une fonction, pas pour une seule ligne. Notez également que "dépréciation" ne doit pas être capitalisé, alors que cela ne semble pas avoir d'importance pour "NewApi".

4
user1

J'ai remarqué que l'annotation en ligne @SuppressLint("deprecated") ne sera plus capturée, alors que @SuppressWarnings("deprecation") est en cours de ramassage.

on peut désactiver les contrôles Deprecation pour le linter Gradle avec lintOptions dans le fichier build.gradle au niveau du module; Bien qu'il n'y ait aucune chance de définir des fichiers individuels comme ça:

Android {
    lintOptions {
        disable 'Deprecation'
    }
}

ou on peut affecter un fichier de configuration lint.xml plutôt détaillé avec LintOptions: lintConfig (lorsque les paramètres showAll true, il affichera toujours les avertissements - quelle que soit la configuration XML fournie):

Android {
    lintOptions {
        lintConfig file("lint.xml")
        showAll false
    }
}

où on peut ajouter des fichiers individuels, en ajoutant leurs chemins:

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="Deprecation" severity="Error">
        <ignore path="app/src/main/Java/com/example/MyApp/CustomListAdapter.Java" />
    </issue>
</lint>

Le code source de com.Android.builder.model.LintOptions pourrait expliquer ce qui se passe réellement là-bas (et confirme environ 50% de ce que j'ai écrit).

afin de supprimer les avertissements intégrés dans Android Studio ... que linter semble être un autre linter - et que ces annotations n’affectent pas le linter de la construction de Gradle (il peut être nécessaire de l’utiliser en combinaison avec l’une des méthodes indiquées ci-dessus, afin d'ignorer les classes et méthodes obsolètes connues):

//noinspection deprecation

update The Android Studio 2.3 les notes de publication mentionnent une nouvelle fonctionnalité:

Lint Baseline: avec Android Studio 2.3, vous pouvez définir des avertissements de peluches non résolus comme base de votre projet. À partir de ce moment, Lint ne signalera que les nouveaux problèmes. Cela est utile si vous avez de nombreux problèmes de charpie hérités dans votre application, mais que vous souhaitez simplement vous concentrer sur la résolution de nouveaux problèmes. En savoir plus sur la base Lint et les nouveaux contrôles et annotations Lint ajoutés à cette version.

ici il est expliqué comment créer un Lint warnings baseline - qui enregistre les avertissements détectés dans un fichier XML puis les met en sourdine (ce qui est bien mieux que d'avoir les annotations de code en ligne, réparties dans tous les sens); Je suppose que les options lintConfig et baseline devraient être combinables (en fonction des besoins).

Android {
    lintOptions {
        baseline file("lint-baseline.xml")
    }
}
3
Martin Zeitler

Vous devez créer un fichier lint.xml pour indiquer à lint ce qu’il faut ignorer.

http://tools.Android.com/tips/lint/suppressing-lint-warnings voir ceci pour plus de détails

le vôtre pourrait ressembler un peu à ça

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <!-- Disable the given check in this project -->
    <issue id="Deprecation">
        <ignore path="app/src/main/Java/com/example/MyApp/CustomListAdapter.Java" />
    </issue>
</lint>

Pour gérer cela dans la source, vous devriez utiliser quelque chose comme 

 @SuppressLint("Deprecation")
3
bestdayever

Pour éviter les avertissements de peluches, scindez toujours les fonctions afin qu'une fonction traite de l'ancien système et une autre, du nouveau système. L'ancien peut supprimer l'avertissement en toute sécurité. Le nouveau doit être annoté pour être utilisé uniquement sur les niveaux les plus récents de l’API.

Voici un exemple de ce à quoi cela devrait ressembler:

    @SuppressWarnings("deprecation")
    private static int getVersionCode_old(@NonNull Context appContext) {
        PackageInfo pInfo;
        try {
            pInfo = appContext.getPackageManager().getPackageInfo(appContext.getPackageName(), 0);
            return pInfo.versionCode;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.P)
    private static int getVersionCode_new(@NonNull Context appContext) {
        PackageInfo pInfo ;
        try {
            pInfo = appContext.getPackageManager().getPackageInfo(appContext.getPackageName(), 0);
            return (int) pInfo.getLongVersionCode();
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    public static int getVersionCodeUniversal(@NonNull Context appContext)
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            return getVersionCode_new(appContext);
        }
        else
        {
            return getVersionCode_old(appContext);
        }
    }

Un autre conseil important pour éviter les avertissements de peluches: si vous utilisez une classe entière dépréciée, supprimez toutes les importations explicites de cette classe. Ensuite, accédez simplement à cette classe en utilisant son chemin complet et ne le faites que dans les anciennes versions de vos fonctions.

Et enfin, vous devriez commencer à utiliser androidX, les nouvelles bibliothèques de Google où vous trouverez de nombreuses fonctions universelles prêtes à être utilisées. Ensuite, vous pouvez économiser beaucoup de temps avec ce genre de petits problèmes. Par exemple, vous pouvez supprimer tout le code de l'exemple ci-dessus et utiliser simplement cette nouvelle fonction universelle androidX:

    PackageInfo.getLongVersionCode()
0
Blackd