kotlin 如何在Android中强制使用自定义组件?

igetnqfo  于 2022-12-23  发布在  Kotlin
关注(0)|答案(3)|浏览(195)

我们在一个项目上与5人合作。我在Android项目中有自定义TextView组件。我的一些团队朋友直接使用Android TextView(或AppCompatTextView)。我想强制使用我创建的自定义TextView文本视图。
我该怎么做?我期待你的帮助,谢谢。

pdsfdshx

pdsfdshx1#

虽然编码指南和代码评审应该会发现这些问题,但您也可以创建一个自定义的lint检查,并强制您的构建在lint错误时失败。
大概是这样的

class TextViewDetector : ResourceXmlDetector() {
    override fun getApplicableElements(): Collection<String>? {
        return listOf(
            "android.widget.TextView", "androidx.appcompat.widget.AppCompatTextView"
        )
    }

    override fun visitElement(context: XmlContext, element: Element) {
            context.report(
                ISSUE, element, context.getLocation(element),
                "Do not use TextView"
            )

    }

    companion object {
        val ISSUE: Issue = Issue.create(
            "id",
            "Do not use TextView",
            "Use custom view",
            CORRECTNESS, 6, Severity.ERROR,
            Implementation(TextViewDetector::class.java, RESOURCE_FILE_SCOPE)
        )
    }
}

有一个guide,一个来自google的repository示例和一个关于如何编写自定义lint检查的广泛的api guide

vltsax25

vltsax252#

您可以创建自己的ViewInflater

class MyViewInflater { 

    fun createView(
        parent: View?, name: String?, context: Context,
        attrs: AttributeSet, inheritContext: Boolean,
        readAndroidTheme: Boolean, readAppTheme: Boolean, wrapContext: Boolean
    ): View {
        // ...
        val view: View = when (name) {
            "TextView",
            "androidx.appcompat.widget.AppCompatTextView",
            "com.google.android.material.textview.MaterialTextView" -> createMyTextView(context, attrs)
            //other views
        }

        //...
        
        return view
    }
    
    fun createMyTextView(context: Context, attrs: AttributeSet) = MyTextView(context, attrs)
}

并将其安装到应用主题中

<style name="Theme.MyAppTheme" parent="Theme.SomeAppCompatParentTheme">
    <item name="viewInflaterClass">package.MyViewInflater</item>
</style>

它将返回您指定的所有标记的视图
参见AppCompatViewInflater

3ks5zfa0

3ks5zfa03#

没有技术上的方法可以做到这一点,答案是编码指南和代码评审。

相关问题