我有一个自定义线性布局和一个带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扩展与数据绑定一起使用的正确方法是什么?
答案 0 :(得分:1)
问题是,展开后的视图未附加到布局。您应该使用AdvancedBoxBinding.inflate(inflater, this, true)
。
在那之后,onFinishInflate()
对您来说并不重要,因为它仅与从XML中扩展视图和层次结构有关,而与您正在执行的代码无关。