使用数据绑定生成的代码使用的布局被 lint 错误地报告为 UnusedResource

Layouts used by code generated with Data Binding incorrectly reported as UnusedResource by lint

Lint 正在考虑 类 使用 Data Binding 生成的布局未使用,因此触发相应的 UnusedResource警告。

例如:

../../src/main/res/layout/activity_start.xml:2:资源R.layout.activity_start似乎未使用

尽管在使用数据绑定生成的 类 之一中有引用:

public static ActivityStartBinding inflate(android.view.LayoutInflater inflater, android.databinding.DataBindingComponent bindingComponent) {
    return bind(inflater.inflate(com.tuenti.messenger.R.layout.activity_start, null, false), bindingComponent);
}

有没有办法让 lint 考虑生成的 类 以避免这些误报?

不,你不能强制 lint 考虑生成的 classes.I 会建议你将它们设置为信息或忽略而不是警告。

您绝对可以将它们设置为信息或忽略而不是警告 (Window/Preferences/Android/Lint ErrorChecking/Performance/UnusedResources)。

我有同样的问题,并通过使用 DataBindingUtil 助手而不是生成的 class 解决了这个问题。你可以这样使用它:

binding = DataBindingUtil.inflate(inflater, R.layout.activity_start, container, false)

请注意,它将 return 一个 ActivityStartBinding 而不是一个通用对象,这正是您想要的。由于您的布局直接从您的代码中使用,而不是从生成的代码中使用,因此 Lint 不再有问题。

我一直在研究这个问题并找到了一个允许使用生成的 类.

的解决方案

首先,您必须将 checkGeneratedSources = true 添加到 lintOptions 块中。例如,在您的应用程序模块中 build.gradle:

android {
    lintOptions {
        checkDependencies = true
        checkGeneratedSources = true
    }
}

Lint 现在应该包括生成的源文件,并且不会再给出误报。您可能 运行 遇到其他问题,其中生成的文件会引发不同的错误,在我的例子中,一些与 Room 相关的生成文件违反了 RestrictedApi 规则。如果是这种情况,只需将规则添加到 lint.xml 以在生成的代码上从 运行ning 中排除该规则,如下所示:

<issue id="RestrictedApi" severity="error">
    <ignore path="build" />
</issue>