用于检查布局中所有视图的自定义线规则

问题描述 投票:0回答:1

在我正在使用的应用程序中,必须在所有布局文件中的所有视图上都设置为id。因此,我正在尝试构建自定义的棉绒规则以强制执行此操作。

通常,将使用getApplicableElements()中的XmlScanner方法,并为每个元素标签包括一个字符串列表。但是,我似乎无法找到一种方法来查看子类View中XML布局中的所有元素。

但是,我尝试使用XmlScannerConstants.ALL,它查看每个XML文件中的每个元素。鉴于我们还有其他几种基于XML的资源,将无法使用。

我的检查器类代码如下。有谁知道过滤getApplicableElements()的好方法,以便它查看子类View的每个元素,仅此而已?

class IdDetector : ResourceXmlDetector() {

    companion object {

        private const val ISSUE_ID = "MissingId"
        private const val ISSUE_DESCRIPTION = "Missing required attribute 'id'"
        private const val ISSUE_EXPLANATION = "Identifiers are required on all views."

        val ISSUE = Issue.create(
            id = ISSUE_ID,
            briefDescription = ISSUE_DESCRIPTION,
            explanation = ISSUE_EXPLANATION,
            category = Category.A11Y,
            priority = 10,
            severity = Severity.FATAL,
            androidSpecific = true,
            implementation = Implementation(IdDetector::class.java, Scope.RESOURCE_FILE_SCOPE)
        )
    }

    override fun getApplicableElements(): Collection<String>? = XmlScannerConstants.ALL

    override fun visitElement(context: XmlContext, element: Element) {
        if (!element.hasAttributeNS("http://schemas.android.com/apk/res/android", "id")) {
            context.report(ISSUE, element, context.getLocation(element), ISSUE_DESCRIPTION)
        }
    }
}

在我正在开发的应用中,必须在所有布局文件中的所有视图上都设置一个ID。因此,我正在尝试构建自定义的棉绒规则以强制执行此操作。通常,人们会使用...

android lint
1个回答
0
投票

[appliesTo(@NonNull ResourceFolderType folderType)方法可以帮助您实现。就您而言,我相信您只会对定位layout文件夹感兴趣。您是新的探测器,看起来像这样:

© www.soinside.com 2019 - 2024. All rights reserved.