在我正在使用的应用程序中,必须在所有布局文件中的所有视图上都设置为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。因此,我正在尝试构建自定义的棉绒规则以强制执行此操作。通常,人们会使用...
[appliesTo(@NonNull ResourceFolderType folderType)
方法可以帮助您实现。就您而言,我相信您只会对定位layout文件夹感兴趣。您是新的探测器,看起来像这样: