具有数据绑定的自定义视图中的 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 膨胀视图和层次结构相关,而不是像你正在做的那样从代码膨胀。
我有一个自定义线性布局和一个带有 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 膨胀视图和层次结构相关,而不是像你正在做的那样从代码膨胀。