【问题标题】:Android Studio: false Lint warning forcing usage of "Compat" classes when high min SDK (25)Android Studio:错误的 Lint 警告在高 min SDK 时强制使用“Compat”类 (25)
【发布时间】:2021-03-15 08:35:03
【问题描述】:

我正在处理一个将minSdkVersion 设置为25(又名Android 7.1)的项目。

由于这个版本相当高,所以我可以使用很多方法而不必担心向后兼容性。

例如,从Fragment 检索drawable 应该很简单:

context?.getDrawable(R.drawable.my_drawable)

在源码中,它的作用是:

 return getResources().getDrawable(id, getTheme());

据我所知,API 21(Android 5.0)中引入了这种方法。

但是,我收到以下警告:

ContextCompat.getDrawable(...)的源码:

 if (Build.VERSION.SDK_INT >= 21) {
     return context.getDrawable(id);
 } else if (Build.VERSION.SDK_INT >= 16) {
     return context.getResources().getDrawable(id);
 } else { ... }

由于 min SDK 设置为 25,第一个 if 将始终被调用,这与我编写的代码相同。那么为什么会出现警告呢?

我可以用@SuppressLint("UseCompatLoadingForDrawables") 压制它,但它有点破坏目的......或者我可以遵循它......

这正常吗?我真的应该使用ContextCompat 及其附属机构,还是在某处设置来删除这样的false 警告?

PS:该项目也在使用 Android X。

【问题讨论】:

  • 作为对这个问题的补充:更新的 lint 规则,即 UseCompatTextViewDrawableXmlUseAppTint,强制在 xml 中使用 compat app: 属性,这听起来也有点矫枉过正。对此有一个称职的答案会很棒。

标签: android android-studio androidx lint backwards-compatibility


【解决方案1】:

遇到了同样的问题。当您的 minSdk >= 21 时,我会说这是误报。因为正如您所说,您将始终进入调用 getDrawable 的 if 分支。

因此,抑制/忽略它是一种方法,直到有人可以使 lint 规则足够智能以检测到您的 minSdkVersion 高于 21。您可以通过在 build.gradle 中执行此操作来全局忽略它:

android { 
    ...
    lintOptions { 
        ignore("UseCompatLoadingForDrawables")
    }
}

有趣的是,context.getColor(R.color.something) 没有给出类似的警告,即使它在 ContextCompat.getColor 中有类似的代码。

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 2014-06-09
    • 2017-05-05
    • 2018-08-24
    • 2014-08-23
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多