通过继承另一个CustomView创建CustomView

Creating CustomView by inheriting another CustomView

我正在处理一个项目,我必须在其中使用不同类型的自定义视图。这些自定义视图共享一些通用功能,因此我决定创建一个超类并将所有通用功能放在那里。让我们调用我的超类 BaseCustomView 和子类 ACustomView.

这是我的 BaseCustomView 的样子:

open class BaseCustomView@JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
    FrameLayout(context, attrs, defStyleAttr) {

    protected fun saveDetails() {
        // Saving details
   }
}

我从我的子类中调用这个函数。这是我的 ACustomView 的样子:

class ACustomView@JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : BaseCustomView(context, attrs, defStyleAttr) {
    
    fun startProcess() {
        saveDetails()
        //Start the process
    }

}

到这里为止看起来还不错。现在,当我在片段中使用 ACustomView 并使用 viewBinding 调用 startProcess() 函数时,会出现以下错误: Unresolved reference: startProcess

这是我在片段中调用函数的代码:

binding.customView.startProcess()

谁能帮我解决这个问题?我不知道我做错了什么。任何帮助表示赞赏。谢谢!

生成的绑定 class 创建了 View class 而不是 ACustomView.

视图绑定库在处理您的自定义视图时出现问题。

您可以使用 findViewById(...) 获取视图。

我相信视图绑定确实支持自定义视图,所以如果我能找到让它工作的方法,我会在这里更新。

终于,我可以让它工作了。正如@ShlomiKatriel 所解释的,我遇到这个问题是因为生成的绑定 class 创建了一个 View class 而不是 ACustomView.

我能够通过首先使用 findViewById()、运行 应用程序然后将 findViewById() 替换为生成的绑定 class 来解决这个问题。出于某种原因,在使用 findViewById() 之后,它会生成正确的绑定 class。 ‍♂️