【发布时间】:2023-04-10 21:37:01
【问题描述】:
我正在创建一个计算器。但是setOnClickListeners() 太多了,很难进步。这属于一个片段,它也有一个 ViewModel。我在这里使用数据绑定。
如果有什么方法我可以在下面提到的上下文中编写更少的代码。
如果对问题有任何困惑,请在评论中写下。如果我的方法有误,请在 cmets 中分享
我的代码:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.calculatorViewModel = viewModel
binding.lifecycleOwner = viewLifecycleOwner
viewModel.currentExpression.value = "814×122" //temporary value
viewModel.currentResult.value = "99308" //temporary value
binding.etInput.doAfterTextChanged {
viewModel.currentExpression.value = it.toString()
binding.tvOutputPreview.text = viewModel.currentExpression.value
}
binding.apply {
// Extra operators - setOnClickListener
btnClear.setOnClickListener { viewModel.onClear() }
btnAllClear.setOnClickListener { viewModel.onAllClear() }
btnPlusMinus.setOnClickListener { }
btnEqual.setOnClickListener { }
// Operators - setOnClickListener
btnDivide.setOnClickListener {
viewModel.mountOperator(btnDivide.text) }
btnMultiply.setOnClickListener { viewModel.mountOperator(btnMultiply.text) }
btnMinus.setOnClickListener { viewModel.mountOperator(btnMinus.text) }
btnPlus.setOnClickListener { viewModel.mountOperator(btnPlus.text) }
//Secondary operators - setOnClickListener
btnPercent.setOnClickListener { }
btnDecimal.setOnClickListener { }
// Numbers - setOnClickListener
btn0Num.setOnClickListener { }
btn1Num.setOnClickListener { }
btn2Num.setOnClickListener { }
btn3Num.setOnClickListener { }
btn4Num.setOnClickListener { }
btn5Num.setOnClickListener { }
btn6Num.setOnClickListener { }
btn7Num.setOnClickListener { }
btn8Num.setOnClickListener { }
btn9Num.setOnClickListener { }
}
binding.btnClear.setOnClickListener { viewModel.onClear() }
binding.btnAllClear.setOnClickListener { viewModel.onAllClear() }
binding.btnPlusMinus.setOnClickListener { }
}
【问题讨论】:
-
您的代码对我来说似乎还可以,如果没有它们就无法工作,
clickListeners并不算多。 -
我也会这么说,不会太多。有很多按钮要点击,因此有很多点击监听器。令我惊讶的是您使用数据绑定,但似乎您没有在 XML 中设置值(或单击侦听器)
-
@Michiel 我实际上是在使用数据绑定来实现 LiveData,这样我就可以在 ViewModel 类中执行我的大部分工作。您能否解释一下我在数据绑定方面做错了什么,因为我不明白您的意思
-
有单向视图绑定和双向databinding。你菲。在 Kotlin 中调用
binding.tvOutputPreview.text = viewModel.currentExpression.value,但使用数据绑定通常会在 XML 中设置它。虽然,我当然没有看到 XML,但很可能是您在某些情况下使用数据绑定 - 这很好。
标签: android kotlin android-fragments data-binding