У меня есть пользовательский линейный макет и файл xml с 3 флажками. Пользовательский линейный макет выглядит примерно так:
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)
}
Проблема в том, что установка onClickListener для любого из флажков в onFinishInflate () вызовет исключение NullPointerException. Я думал, что переопределение getRootView () будет решением, но это не сработало. Что-то, что будет работать, следующее
val root = mBinding.root
root.cbVolumeChange ...
Но я бы не хотел этого делать. Итак, как правильно использовать расширение Android Kotlin с привязкой данных в моем случае?
Проблема в том, что надутый вид не привязан к макету. Для этого вам следует использовать AdvancedBoxBinding.inflate(inflater, this, true).
После этого onFinishInflate() для вас не имеет значения, поскольку он актуален только для расширения представления и иерархии из XML, а не из кода, как вы это делаете.
Работает отлично, большое спасибо за объяснение :)