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

时间:2018-10-18 14:42:52

标签: android kotlin android-databinding kotlin-extension

我有一个自定义线性布局和一个带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扩展与数据绑定一起使用的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

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

在那之后,onFinishInflate()对您来说并不重要,因为它仅与从XML中扩展视图和层次结构有关,而与您正在执行的代码无关。