Расширения Kotlin для Android в пользовательском представлении с привязкой данных - PullRequest
0 голосов
/ 18 октября 2018

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

1 Ответ

0 голосов
/ 18 октября 2018

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

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

...