27

我使用版本开关来支持较旧的 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);
                            ^

我可以注释特定的行或方法以使警告静音(因为我是故意这样做的)?我不想禁用所有警告。

4

8 回答 8

15

大小写很重要,使用以下内联或类范围:

@Suppress("DEPRECATION")

这是在 Kotlin 中。

于 2019-08-20T13:38:08.273 回答
13

我注意到@SuppressLint("deprecated")内联注释将不再被拾取 - 而@SuppressWarnings("deprecation") 正在被拾取。

可以在模块级文件中禁用对DeprecationGradle linter 的检查;虽然没有机会像这样定义单个文件:lintOptionsbuild.gradle

android {
    lintOptions {
        disable 'Deprecation'
    }
}

或on 可以使用LintOptions:lintConfig分配一个相当详细lint.xml的配置文件(设置时,它仍然会显示警告 - 无论提供的 XML 配置如何):showAll true

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 中的内联警告...该 linter 似乎是另一个 linter - 这些注释不会影响 Gradle 构建的 linter(可能需要将其与所述方法之一结合使用上面,为了忽略已知的不推荐使用的类和方法):

//noinspection deprecation

更新Android Studio 2.3发行说明提到了一个新特性:

Lint 基线:使用 Android Studio 2.3,您可以将未解决的 lint 警告设置为项目中的基线。从那时起,Lint 将仅报告新问题。如果您的应用程序中有许多遗留的 lint 问题,但只想专注于解决新问题,这将很有帮助。了解有关 Lint 基线以及此版本中添加的新 Lint 检查和注释的更多信息。

这里解释了如何创建一个 Lint 警告baseline——它将检测到的警告记录到一个 XML 文件中,然后将它们静音(这比内联代码注释要好得多,分布在各处);我假设,这些选项lintConfig应该baseline是可组合的(取决于要求)。

android {
    lintOptions {
        baseline file("lint-baseline.xml")
    }
}
于 2017-03-05T09:41:45.370 回答
7

只是一些新的东西:不确定 Android Studio,但是,要从此行中删除此警告,您可以使用:

//noinspection deprecation

这将删除下一行的警告。例如:

//noinspection deprecation
e.setBackgroundDrawable(editTextDrawable);

它不会显示错误。但是,正如@JJD 所说,这仍然会向控制台输出警告。但至少你可以有一个很好的无错误代码,它可以像 Git 一样有用。而且,这可以防止出现问题@SupressWarnings,即它忽略方法中的所有警告。因此,如果您有一些您不知道的已弃用的内容,请将其@SupressWarnings隐藏并且不会收到警告。这就是它的优势//noinspection

于 2016-07-23T18:13:24.727 回答
5

我遇到了类似的问题。首先我得到一个编译器警告:

: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”似乎并不重要。

于 2014-09-17T11:38:54.210 回答
2

您需要创建一个 lint.xml 文件来告诉 lint 忽略什么。

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")
于 2014-06-13T15:22:43.440 回答
2

为避免 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()
于 2019-01-09T10:53:16.357 回答
0

只需@SuppressWarnings("deprecation")在函数上方使用来抑制该函数的特定警告。

奇迹般有效!

@Blackd 有更好的答案。你应该接受!

于 2019-07-17T10:31:23.407 回答
0

尝试找到一种方法ViewCompat来替换不推荐使用的方法。

在您的情况下,使用ViewCompat.setBackground(View, Drawable).

有许多以XXXCompat此类情况命名的类,例如ContextCompat,ActivityCompat等等。

于 2019-10-16T02:31:13.213 回答