具有数据绑定的自定义视图中的 Kotlin android 扩展

Kotlin android extensions in custom view with databinding

我有一个自定义线性布局和一个带有 3 个复选框的 xml 文件。自定义线性布局大致如下所示:

class AdvancedBox : LinearLayout, DefineExchangesDialog.DefineExchangesDialogListener {

    private lateinit var mBinding: AdvancedBoxBinding

    private lateinit var viewModel: GlobalConfigViewModel

    constructor(c: Context) : super(c) {
        initLayout()
    }

    constructor(c: Context, a: AttributeSet) : super(c, a) {
        initLayout()
    }

    private fun initLayout() {
        val inflater = LayoutInflater.from(context)
        mBinding = AdvancedBoxBinding.inflate(inflater)
    }

    override fun getRootView(): View {
        return mBinding.root
    }

    fun setViewModel(viewModel: GlobalConfigViewModel){
        mBinding.viewModel = viewModel
    }

    override fun onFinishInflate() {
        super.onFinishInflate()

        //cbVolumeChange is an id defined in advanced_box.xml 
        cbVolumeChange.setOnClickListener(this::onShowAdvanced)
        cbExchanges.setOnClickListener(this::onShowAdvanced)
        cbPriceFilter.setOnClickListener(this::onShowAdvanced)
    }  

问题是在 onFinishInflate() 中的任何复选框上设置 onClickListener 将导致 NullPointerException。我认为覆盖 getRootView() 将是解决方案,但这没有用。以下是可行的

val root = mBinding.root
root.cbVolumeChange ...

但这不是我想做的事。那么在我的案例中,使用 Android Kotlin 扩展和数据绑定的正确方法是什么?

问题是,展开视图未附加到布局。你应该为它使用 AdvancedBoxBinding.inflate(inflater, this, true)

在那之后 onFinishInflate() 对你来说并不重要,因为它只与从 XML 膨胀视图和层次结构相关,而不是像你正在做的那样从代码膨胀。