Как подавить конкретное предупреждение Lint для устаревших функций Android?
Я использую версию для поддержки старых версий 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);
}
Когда вы создаете проект с помощью Gradle из командной строки, Lint выводит следующее предупреждение:
app/src/main/java/com/example/MyApp/CustomListAdapter.java:92: warning:
[deprecation] setBackgroundDrawable(Drawable) in View has been deprecated
viewHolder.shape.setBackgroundDrawable(colorDrawable);
^
Могу ли я аннотировать конкретную строку или метод для отключения предупреждения (поскольку я делаю это специально)? Я не хочу отключать все предупреждения.
Ответы
Ответ 1
Просто что-то новое: не уверен в Android Studio, но, чтобы удалить это предупреждение из этой строки, вы можете использовать:
//noinspection deprecation
Это приведет к удалению предупреждения со следующей строки. Например:
//noinspection deprecation
e.setBackgroundDrawable(editTextDrawable);
Он не покажет ошибку. Однако, как сказал @JJD, это все еще выводит предупреждение на консоль. Но по крайней мере у вас может быть хороший код без ошибок, который может быть полезен, например, для Git. И это предотвращает проблему с @SupressWarnings
, которая игнорирует все предупреждения в методе. Поэтому, если у вас есть что-то устаревшее, о котором вы не знаете, @SupressWarnings
скроет его, и вы не будете предупреждены. Это преимущество //noinspection
Ответ 2
Я заметил, что встроенная аннотация @SuppressLint("deprecated")
больше не будет восприниматься - пока @SuppressWarnings("deprecation")
is подбирается.
можно отключить проверки Deprecation
для Gradle Linter с помощью lintOptions
в файле build.gradle
уровня модуля; пока нет возможности определить отдельные файлы следующим образом:
android {
lintOptions {
disable 'Deprecation'
}
}
или on может назначить один довольно подробный файл конфигурации lint.xml
с помощью LintOptions: lintConfig (при настройках showAll true
он все равно будет отображать предупреждения - независимо от предоставленной конфигурации XML):
android {
lintOptions {
lintConfig file("lint.xml")
showAll false
}
}
где можно добавлять отдельные файлы, добавляя их пути:
<?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>
Исходный код com.android.builder.model.LintOptions
может объяснить, что на самом деле там происходит (и подтверждает около 50% того, что я написал).
чтобы избавиться от встроенных предупреждений в Android Studio... этот линтер выглядит как другой линтер - и эти аннотации не влияют на линтер сборки Gradle (может потребоваться использовать его в сочетании с одним из указанных методов выше, чтобы игнорировать известные устаревшие классы и методы):
//noinspection deprecation
обновление В заметках о выпуске Android Studio 2.3 упоминается новая функция:
Базовая линия Lint: в Android Studio 2.3 вы можете установить нерешенные предупреждения о задержках в качестве базовой линии в своем проекте. С этого момента Lint будет сообщать только о новых проблемах. Это полезно, если у вас в приложении много проблем с ворсом, но вы просто хотите сосредоточиться на исправлении новых проблем. Узнайте больше о базовой линии Lint и новых проверках Lint & аннотации добавлены в этом выпуске.
здесь объясняется, как создавать предупреждения Lint baseline
- который записывает обнаруженные предупреждения в файл XML, а затем отключает их (что намного лучше, чем встроенные аннотации кода, распределенные повсеместно); Я бы предположил, что опции lintConfig
и baseline
должны быть совместимы (в зависимости от требований).
android {
lintOptions {
baseline file("lint-baseline.xml")
}
}
Ответ 3
У меня возникла аналогичная проблема. Сначала я получил предупреждение о компиляторе:
:compileDebugJava
Note: /path/file.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Что вы можете подавить с помощью @SuppressWarnings("deprecation")
или просто игнорировать, поскольку это предупреждение, и это приводит к сбою сборки. Кроме того, я получил ошибку lint (подробности в файле build/lint-results.html
):
Call requires API level 13 (current min is 9)
Это можно было бы подавить добавлением @SuppressLint("NewApi")
. В качестве альтернативы вы можете использовать @TargetApi(13)
чтобы намекнуть, что метод/класс могут использовать методы, зависящие от API версии 13, а не то, что вы установили как minSdkVersion
(например, 9).
Аннотации могут выполняться только на уровне класса или функции, а не на одной строке. Также обратите внимание, что "девальвация" не должна быть заглавной, а для "NewApi" это, похоже, не имеет значения.
Ответ 4
Вам нужно создать файл lint.xml, чтобы сообщить, что игнорировать.
http://tools.android.com/tips/lint/suppressing-lint-warnings см. это для более подробной информации
ваш может выглядеть немного так
<?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>
Чтобы справиться с этим в источнике, вы должны использовать что-то вроде
@SuppressLint("Deprecation")
Ответ 5
Важен регистр, используйте следующее встроенное или общеклассовое:
@Suppress("DEPRECATION")
Это в Котлине.
Ответ 6
Попробуйте найти метод из ViewCompat
, чтобы заменить устаревший метод.
В вашем случае используйте ViewCompat.setBackground(View, Drawable)
.
Для таких случаев существует множество классов с именем XXXCompat
, таких как ContextCompat
, ActivityCompat
и так далее.
Ответ 7
Чтобы избежать предупреждений lint, всегда разделяйте функции так, чтобы одна функция имела дело со старой системой, а другая - с новой системой. Старый может безопасно подавить предупреждение. Новый должен быть аннотирован для использования только на новейших уровнях API.
Вот пример того, как это должно выглядеть:
@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);
}
}
Еще один важный совет, чтобы избежать предупреждений lint: если вы используете весь устаревший класс, вы должны удалить все явные импорты для этого класса. Затем просто получите доступ к этому классу напрямую, используя его полный путь, и делайте это только в старых версиях ваших функций.
И, наконец, вы должны рассмотреть возможность использования androidX, новых библиотек Google, где вы найдете множество универсальных функций, готовых к использованию. Тогда вы можете сэкономить много времени с такими мелкими проблемами. Например, вы можете удалить весь код из приведенного выше примера и просто использовать эту новую и универсальную функцию androidX:
PackageInfo.getLongVersionCode()
Ответ 8
Просто используйте @SuppressWarnings("deprecation")
над функцией, чтобы @SuppressWarnings("deprecation")
это конкретное предупреждение только для этой функции.
Работает как шарм!
У @Blackd есть лучший ответ. Вы должны принять это!