Расширения Kotlin для Android в пользовательском представлении с привязкой данных

У меня есть пользовательский линейный макет и файл 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 с привязкой данных в моем случае?

0
0
615
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что надутый вид не привязан к макету. Для этого вам следует использовать AdvancedBoxBinding.inflate(inflater, this, true).

После этого onFinishInflate() для вас не имеет значения, поскольку он актуален только для расширения представления и иерархии из XML, а не из кода, как вы это делаете.

Работает отлично, большое спасибо за объяснение :)

Doflaminhgo 18.10.2018 20:06

Другие вопросы по теме